nodejs+koa2+mongodb построить свой собственный проект от 0 до 1

Node.js внешний интерфейс MongoDB koa

Я думаю, это будет полезно для друзей, которые хотят начать писать 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, мы запросим нашу базу данных и вернемся после запроса данных. Как видно из рисунка выше, у нас изначально не было коллекции пользователей, при запуске программы наша база данных автоматически добавит коллекцию и данные:

После запуска:

Посетите нас на локальном хосте: 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, а затем немного обработки файлов, различения модулей, мы можем завершить построение базовой структуры.