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

时间:2018-03-02 09:04:16

标签: javascript node.js express

我目前正在研究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'),它应该从数据库返回验证错误消息。该函数有效,它被定义为返回一个promise,但我总是得到SyntaxError: Unexpected identifier函数...

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

谢谢

1 个答案:

答案 0 :(得分:2)

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

Mongoose本身也可以返回promise,而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; 函数将允许任何错误通过promises冒出来。

xdotool keydown N click 1 keyup N