路由器没有从数据库函数中得到响应

Router doesn't get response from database functions

当 运行 应用程序和测试 /signup 路由时,数据被写入数据库,我可以 console.log 它来自 database/models.js 文件,但在 routes/index.js 文件 returns “出了点问题。”邮递员什么也没显示,甚至没有空数组或对象。

routes/index.js

var express = require('express');
var router = express.Router();
const database = require('../database/models');


router.post('/signup', function(req, res, next) {
    if (!req.body.email || !isValidEmail(req.body.email))
        res.status(400).send('Email invalid.');
    else if (!req.body.username || !isValidCredential(req.body.username) || !req.body.password || !isValidCredential(req.body.password))
        res.status(400).send('Username/password invalid.');
    else {
        const result = database.createUser(req.body.email, req.body.username, req.body.password);
        if (result)
            res.status(200).send(result);
        else 
            res.send('Something went wrong.');
    }
});

function isValidEmail (email) {
    if (email.match("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"))
        return true;
    else
        return false;
}

function isValidCredential (credential) {
    if (credential.length < 6)
        return false;
    else if (credential.match(/^[a-z0-9]+$/i))
        return true;
    else
        return false;
}

module.exports = router;

database/models.js

const tools = require('./tools');
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const userSchema = new Schema({
    email: String,
    username: String,
    hashedPassword: String,
    salt: String,
    accessToken: { type: String, default: "" }
});


const User = mongoose.model('User', userSchema);


function createUser(email, username, password) {
    const hashPass = tools.generatePassword(password);
    const newUser = new User({
        email: email,
        username: username,
        hashedPassword: hashPass.hash,
        salt: hashPass.salt
    });

    newUser.save(function (error, result) {
        if (error)
            return handleError(error);
        return { email: result.email, username: result.username };
    });
}

module.exports.createUser = createUser;

在您的代码中,您在调用 createUser 函数时没有 returning 任何东西。这里有几个注意事项:

// index.js
const result = database.createUser(req.body.email, req.body.username, req.body.password);

因为 createUser 是对数据库执行的操作,它可能是异步的,因此也是它的结果。我建议使用 async/await 来确定 returned 结果。此外,您需要将 models.js 文件的代码更改为 return Promise 并等待它。

function createUser(email, username, password) {
    const hashPass = tools.generatePassword(password);
    const newUser = new User({
        email: email,
        username: username,
        hashedPassword: hashPass.hash,
        salt: hashPass.salt
    });

    return new Promise((resolve, reject)=> {
        newUser.save(function (error, result) {
            if (error) reject(error);
            resolve({ email: result.email, username: result.username });
        });
    });
}

然后你必须 await 才能得到你的结果。您可以通过以下方式进行:

// index.js
// Add async here
router.post('/signup', async function(req, res, next) {
    // ...other code
    // Add await here
    const result = await database.createUser(req.body.email, req.body.username, req.body.password);

我想通了。

在 routes/index.js 中使用 async/await 像这样:

router.post('/signup', async function(req, res, next) {
    try {
        if (!req.body.email || !isValidEmail(req.body.email))
            res.status(400).send('Email invalid.');
        else if (!req.body.username || !isValidCredential(req.body.username) || !req.body.password || !isValidCredential(req.body.password))
            res.status(400).send('Username/password invalid.');
        else {
            const result = await database.createUser(req.body.email, req.body.username, req.body.password);
            if (result)
                res.status(200).send(result);
            else 
                res.status(403).send(result);
        }
    } catch (error) { return error; }
});

并且在 database/models.js 中也使用 async/await,但也将 mongoose 方法重写为没有回调的方法,将 returns 写入变量,如下所示:

async function createUser(email, username, password) {
    try {
        const hashPass = tools.generatePassword(password);
        const newUser = new User({
            email: email,
            username: username,
            hashedPassword: hashPass.hash,
            salt: hashPass.salt
        });

        const result = await newUser.save();
        return { email: result.email, username: result.username };
    } catch (error) { console.log (error); return error; }
}