【问题标题】:Nodejs controller returning promise instead of boolean [duplicate]Nodejs控制器返回承诺而不是布尔值[重复]
【发布时间】:2021-02-13 03:30:31
【问题描述】:

我正在调用一个控制器来返回真或假

控制器不工作:

const jwt = require('jsonwebtoken');

class TokenController {
    static async isValidToken(token) {
        try {
            jwt.verify(token, process.env.TOKEN_SECRET);
            return true;
        } catch {
            return false;
        }
    }
}

module.exports = TokenController;

路由器:

const router = require('express').Router({ mergeParams: true });
const TokenController = require('../../controllers/token');

router.get('/', (req, res) => {
    console.log(TokenController.isValidToken(req.cookies['auth-token']));
}

module.exports = router;

它返回 Promise { true }Promise { false } 取决于控制器,但是当我在路由器中接收时它返回一个承诺,但它应该返回一个布尔值

工作控制器

const ScrumTask = require('../models/ScrumTask');
const User = require('../models/User');

class ScrumController {
    static async getTask(id) {
        console.log(id);
        const taskData = await ScrumTask.findOne(
            { _id: id },
            async (err, data) => {
                if (!err) {
                    return data;
                } else {
                    console.log('error');
                    res.status(400).send(err);
                }
            }
        );
        return taskData;
    }
}

module.exports = ScrumController;

路由器调用我的工作控制器

const router = require('express').Router({ mergeParams: true });

const translate = require('../../../config/translate.json');

// Import Controllers
const TokenController = require('../../controllers/token');
const ScrumController = require('../../controllers/scrum');

router.get('/view_task/:id', async (req, res) => {
    let id = req.params.id;

    const taskData = await ScrumController.getTask(id);
}

module.exports = router;

【问题讨论】:

    标签: javascript node.js model-view-controller


    【解决方案1】:

    如果你使用async,那么你总是会得到Promise。 此外,我最好使用Promise.resolve 来返回同步结果(您的情况):

    static async isValidToken(token) {
            try {
                jwt.verify(token, process.env.TOKEN_SECRET);
                return Promise.resolve(true);
            } catch {
                return Promise.resolve(false);
            }
        }
    

    或者,如果所有返回路径都是同步的,那么只需从函数定义中删除 async

    【讨论】:

    • 它确实有效,但我有另一个控制器返回字符串,它也使用async 函数,它不返回任何Promise
    • 好的,显示另一个控制器以及如何从中调用函数
    • 可能是因为它返回一个 JSON 类型的变量
    • 函数返回的签名中包含async 的数据类型没有区别。它总是返回带有适当数据的 Promise。
    • 我已经添加了我的工作控制器的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2019-06-10
    相关资源
    最近更新 更多