NodeJS等待/异步不在对象中工作

问题描述 投票:0回答:1

我目前正在研究nodeJs中的验证模块,我似乎无法理解async / await如何或为什么在我当前的模块中不起作用。

在模块中,我应该能够有多个验证导出ex:Forms,Data等。

每个对象应该有更多的验证函数,例如:表单应该有注册,登录,添加等...

这是我的方法

var forms = {
    validation: {
        status: true,
        data: {},
        error: {}
    },

    register: async(data) => new Promise((resolve, reject) => {
        var validation = forms.validation;

        try {
            const errorMessages = await forms.getErrorMessages('register');
            ...
        } catch (error) {
            reject(error);
        }
    }),


    getErrorMessages: (key) => new Promise((resolve, reject) => {
        Errors.
        findOne({ type: 'validation', 'identifier': key }).
        select('content').
        populate('content'). // only works if we pushed refs to children
        exec(function(err, contentObj) {
            if (err) reject(err);
            var errorMessages = {};
            const contentArray = contentObj.content;
            for (var i = 0; i < contentArray.length; i++) {
                var key = contentArray[i].identifier,
                    message = contentArray[i].message;
                errorMessages[key] = message;
            }
            resolve(errorMessages);
        });
    }),

};
exports.forms = forms;

现在在register函数,定义为async函数,在try我有await forms.getErrorMessages('register')应该从数据库返回验证错误消息...函数工作,它被定义为返回一个承诺但我总是得到SyntaxError: Unexpected identifier的功能...

任何人都可以解释为什么这不起作用?

谢谢

javascript node.js express
1个回答
2
投票

当你已经有了Promise时,没有必要创建new Promises。只有当您将一些非承诺的API转换为承诺时,才需要这样做。

Mongoose本身也可以返回承诺,而async函数将允许任何错误通过承诺冒出来。

var forms = {

    validation: {
        status: true,
        data: {},
        error: {}
    },

    register: async (data) => {
        var validation = this.validation;
        const errorMessages = await this.getErrorMessages('register');
        ...
    },


    getErrorMessages: async (key) => {
        let contentObj = await Errors.findOne({ type: 'validation', 'identifier': key })
            .select('content')
            .populate('content') // only works if we pushed refs to children
            .exec()

        let errorMessages = {};
        const contentArray = contentObj.content;
        for (var i = 0; i < contentArray.length; i++) {
             let key = contentArray[i].identifier;
             let message = contentArray[i].message;
             errorMessages[key] = message;
        }
        return errorMessages;

    }

};
exports.forms = forms;
© www.soinside.com 2019 - 2024. All rights reserved.