JS - 异步函数解析错误

3

我创建了一个基于node.js的Web应用程序。目前我正在使用MSSQL作为数据库。我创建了函数(sql.js),执行相应的SQL函数。我还创建了异步函数处理程序(controllers.js),以便在我的路由器(express)中使用async和await关键字。路由器使用await关键字调用它们。调用这些函数时,我没有遇到任何错误,事实上一切都返回数据并正常运行,但是在我的文本编辑器(VSCode)中,我遇到以下错误

[eslint] Parsing error: Unexpected token =>

经进一步调查,发现在我的控制台中出现了一个未处理的Promise错误。这让我想到我可能没有正确定义控制器。

internal/process/warning.js:18 (node:16328) Warning: a promise was created in a handler at D:\Programs\ColdFusion2016\cfusion\wwwroot\vue_starter\node_modules\express\lib\router\index.js:335:12 but was not returned from it, see http:// goo.gl/ rRqMUw
    at Function.Promise.attempt.Promise.try (D:\Programs\ColdFusion2016\cfusion\wwwroot\vue_starter\node_modules\bluebird\js\release\method.js:29:9)

有人发现控制器有什么问题吗?

router.js

const express = require('express');
const router = express.Router();
const {
    asyncGet,
    asyncPost
} = require('../services/controllers')(router);
const sql = require('../services/sql');
const request = require('../services/request');

/// Get Users
asyncGet('/controller/getUsers', async(req, res, next) => {
    console.log('get: /controller/getUsers'); 
    const users = await sql.getUsers(); 
    res.status(200).json(users);   
});
/// Get Products
asyncGet('/controller/getProducts', async(req, res, next) => {
    console.log('get: /controller/getProducts'); 
    const products = await sql.getProducts(); 
    res.status(200).json(products);
});

module.exports = router;

controllers.js

module.exports = (router) => {
    const asyncGet = (route, handler) => {
        return router.get(route, (req, res, next) => {
            handler(req, res, next)
            .catch(error => {
                next(error);
            });
        });
    };
    const asyncPost = (route, handler) => {
        return router.post(route, (req, res, next) => {
            handler(req, res, next)
            .catch(error => {
                next(error);
            });
        });
    };
    return { asyncGet, asyncPost };
};

enter image description here


“ReferenceError: error is not defined” - 但是在您发布的代码中已经定义了它。您的真实代码可能不同,或者错误指的是另一段未在问题中涉及的代码。请考虑提供 https://stackoverflow.com/help/mcve 来复制该问题 - 一个存储库等。关于ESLint错误,请参阅答案。 - Estus Flask
@estus,抱歉我发错了信息。我已经在我的问题中更新了服务器日志输出的错误。之前的消息来自另一个堆栈帖子。在发布之前,我正在编写这个问题。现在所有的代码都一一对应。 - AJ_
错误提示表明 Bluebird Promise(例如 Sequelize 在内部使用它,你是在使用它吗?)没有被链接。但是,在此代码片段中存在的所有 Promise(getProducts 和 getUsers)都已隐式链接了 await。您可以尝试注释掉 await sql.getUsers() 等来检查是否存在问题,但我预计这个错误会发生在其他地方。很难确定错误发生在您发布的代码中。 - Estus Flask
@estus,是的,你说得对。我只是在想,也许eslint会捕获到未处理的Promise。 - AJ_
不,似乎是无关的问题。但是警告指示了一个真正的错误。你在某个地方有一个忘记链接的promise。 - Estus Flask
1个回答

4

为了使ESLint支持async..await,需要在ESLint配置中启用其支持:

{
    "parserOptions": {
        "ecmaVersion": 2017
    }
}

@lolbas 这个代码检查工具可能在语法错误后就退出了。它显然不理解异步箭头函数。 - Estus Flask
@estus,你说得对,eslint与未处理的promise无关。 - AJ_
希望它能在某种程度上有所帮助。 - Estus Flask
@estus,是的。另一个文件也出现了这个错误,所以我不确定是应该编辑问题然后接受你的答案,还是直接接受它。 - AJ_
考虑到标题已经说明了问题,编辑它将有助于其他遇到相同问题的用户。 - Estus Flask

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接