Я думаю, это будет полезно для друзей, которые хотят начать писать nodejs.Тогда, давайте начнем нашу основную тему (скаффолдинг koa-генератора здесь не используется, мы будем непосредственно строить проект сами, который подходит для фронтенда и заднее разделение)
Первый: создать проект
Пакет зависимостей koa может быть установлен глобально (сохраняйте согласованность версии проекта)
npm install -g koa
Или установите его в нашем локальном проекте
npm install koa --save
Мы создали самую простую среду разработки, и мы можем начать путешествие koa:
const Koa = require('koa');
const app = new Koa();
// 对于任何请求,app将调用该异步函数处理请求:
app.use(async (ctx, next) => {
await next();
// todo
});
app.use(async (ctx, next) => {
await next();
// todo
});
// 在端口8081监听:
app.listen(8081);
Самый примитивный способ написания — использовать app.use(async (ctx, next) => {}), а next app.use() может выполняться только после next(), поэтому здесь представлен koa-router
2. Добавьте маршрут
npm install koa-router koa-bodyparser --save
const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const app = new Koa();
app.use(bodyParser()); // 解析request的body
const router = require('koa-router')()
router.get('/', async (ctx, next) => {
// todo
})
app.use(router.routes());
app.listen(9000);
console.log('app started at port 9000...')
прямой доступhttp://localhost:9000, вы можете получить доступ к
Вы также можете префиксировать свои маршруты
const Router = require('koa-router')
const router = new Router({
prefix: '/api'
})
Только нужно получить доступhttp://localhost:9000/api, и когда мы пишем интерфейсы, можно сказать, что этот префикс незаменим.
3. Обработка горячего перезапуска
Каждый раз, когда мы вносим изменения, мы должны закрыть программу, а затем снова запустить npm.Вот как удобно думать о тепле веб-пакета.Если вы хотите строить с помощью веб-пакета, то вам нужно использовать nodemon (Nodemon утилита для отслеживания любых изменений в исходниках и автоматического перезапуска сервера.Идеальная разработка), она также поддерживает пользовательскую конфигурацию nodemon.json Здесь не выполняется настройка, используйте напрямую
npm install nodemon --save
Изменить package.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon app.js"
},
Запускаем npm start, чтобы был достигнут эффект горячего перезапуска, и можно было развиваться в свое удовольствие
4. Поддержка внедрения модулей импорта
Поскольку текущий собственный узел не поддерживает импорт для импорта модулей, при использовании импорта для импорта модулей будет сообщено о следующей ошибке:
На данный момент мы устанавливаем следующие зависимости
npm install babel-plugin-transform-es2015-modules-commonjs babel-register --save
Создайте start.js в корневом каталоге
require('babel-register')
(
{
plugins: ['babel-plugin-transform-es2015-modules-commonjs'],
}
)
module.exports = require('./app.js')
Измените package.json в разделе
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon star.js"
},
npm начать прямой запуск, на этот раз вы можете видеть, что наш проект поддерживается грамматикой импорта
5. Подключитесь к mongodb и мангусту
Я не буду делать здесь инструкцию по установке mongodb.Вы можете установить mongodb самостоятельно.После установки вы увидите следующую картинку, указывающую на то, что установка и запуск прошли успешно.
npm install mongoose --save
Далее я использую простой и насильственный метод для подключения нашей базы данных mongodb, Чтобы все поняли, мы не будем делать иерархическую обработку и обработку файлов (в реальных проектах предполагается, что зарплата не может быть увеличена за счет этого)
добавить в app.js
const db = mongoose.connect("mongodb://localhost/testDB")
// 账户的数据库模型
var UserSchema = new mongoose.Schema({
username:String,
password:String,
email:String
});
var User = mongoose.model('User',UserSchema);
// 新增数据
var user = {
username: 'ydj',
password: '123123',
email: ''
}
var newUser = new User(user);
newUser.save();
router.get('/', async (ctx, next) => {
let val = null
const data = await User.findOne({username: 'ydj'})
console.log('data', data)
const result = {
code:200,
response: data,
ts: 12345
}
ctx.response.body = result
return result
})
Операция здесь следующая: создайте новую модель данных пользователя, затем добавьте данные пользователя в нашу базу данных testDB, а затем, когда мы получим доступ к localhost: 9000, мы запросим нашу базу данных и вернемся после запроса данных. Как видно из рисунка выше, у нас изначально не было коллекции пользователей, при запуске программы наша база данных автоматически добавит коллекцию и данные:
После запуска:
6. Решите междоменный
Наконец, когда интерфейс, который мы написали, должен быть предоставлен другим, проблема междоменного доступа должна быть решена, и сторона koa также очень проста в обращении, обеспечивая обработку koa2-cors.
npm install koa2-cors --save
const cors = require('koa2-cors')
app.use(cors({
exposeHeaders: ['WWW-Authenticate', 'Server-Authorization', 'Date'],
maxAge: 100,
credentials: true,
allowMethods: ['GET', 'POST', 'OPTIONS'],
allowHeaders: ['Content-Type', 'Authorization', 'Accept', 'X-Custom-Header', 'anonymous'],
}));
Для других связанных конфигураций koa2-cors вы можете самостоятельно поискать в Интернете.
7. Резюме
Структура каталогов проекта
├── node_modules 依赖包
├── routes 路由
| ├── index.js
| ├── user.js
├── app.js 主入口文件
├── start.js 处理import配置文件
└── package.json
app.js
const Koa = require('koa')
const mongoose = require('mongoose')
const cors = require('koa2-cors')
const router = require('koa-router')()
// import router from './routes'
const app = new Koa()
// 处理跨域的配置
app.use(cors({
exposeHeaders: ['WWW-Authenticate', 'Server-Authorization', 'Date'],
maxAge: 100,
credentials: true,
allowMethods: ['GET', 'POST', 'OPTIONS'],
allowHeaders: ['Content-Type', 'Authorization', 'Accept', 'X-Custom-Header', 'anonymous'],
}));
const db = mongoose.connect("mongodb://localhost/testDB")
var UserSchema = new mongoose.Schema({
username:String,
password:String,
email:String
});
var User = mongoose.model('User',UserSchema);
router.get('/', async (ctx, next) => {
let val = null
const data = await User.findOne({username: 'yidong'})
console.log('data', data)
const result = {
code:200,
response: data,
ts: 12345
}
ctx.response.body = result
return result
})
app.use(router.routes());
app.listen(9000);
console.log('app started at port 9000...')
package.json
{
"name": "yid",
"version": "1.0.0",
"description": "",
"main": "app.js",
"dependencies": {
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
"babel-register": "^6.26.0",
"koa": "^2.5.3",
"koa-bodyparser": "^4.2.1",
"koa-router": "^7.4.0",
"koa2-cors": "^2.0.6",
"mongoose": "^5.2.17",
"nodemon": "^1.18.4"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon app.js"
},
"author": "",
"license": "ISC"
}
start.js
require('babel-register')
(
{
plugins: ['babel-plugin-transform-es2015-modules-commonjs'],
}
)
module.exports = require('./app.js')
routes/index.js
const router = require('koa-router')()
router.get('/', async (ctx, next) => {
ctx.body = "<div>Hello</div>"
})
router.get('/string', async (ctx, next) => {
ctx.body = 'koa2 string'
})
router.get('/json', async (ctx, next) => {
ctx.body = {
title: 'koa2 json'
}
})
// module.exports = router
export default router
В это время мы можем с радостью начать наш проект nodejs + koa, а затем немного обработки файлов, различения модулей, мы можем завершить построение базовой структуры.