我正在 node+express 上编写注册/授权 API。在任何情况下,路由/registration都应该返回一个像这样的 json 对象:
{
"registered": false, // Есть или нет такой email в базе
"error": false, // Есть ли ошибки валидации
"message": "" // Пишем сообщение что именно не так
}
在客户端,我会阅读这个答案并做出相应的反应。该对象由以下代码构成:
const express = require('express')
const router = express.Router()
const db = require('./dbConnection')
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const { isEmail } = require('./emailValidator.js')
router.post('/registration', (req, res) => {
const email = req.body.email.toLowerCase()
// Основа будущего json-объекта с ответом
let registered = false
let error = false
let message = ''
// Валидация email
if (email == '') {
// Если email пустой
error = true
message = 'Email is empty'
} else if (!isEmail(email)) {
// Если email не корректен
error = true
message = 'Email is incorrect'
}
// Проверим, существует ли такой email в базе данных
db.query(`SELECT * FROM users WHERE email = ${db.escape(email)}`, (err, result) => {
if (result.length) {
// Если что-то вернулось, значт email уже зарегистрирован
// Меняем данные ответа
registered = true
error = true
message = 'This email already in use'
// Проблема здесь. Переменные недоступны снаружи, return не помогает.
} else {
// Если email ранее не регистрировался, пишем его в базу
// registered, error, message остаются дефолтными
}
})
// Возвращаем финальный объект с ответом
const response = { registered, error, message }
res.status(200).json(response)
})
在代码中,我写了我无法获取变量的地方,以将它们添加到响应 json 对象中。怎么把它们弄到外面去?
实际上,您需要将所有内容都包装在一个 Promise 中。
原来是通过回调完成的: