【问题标题】:How to export async function from a node module如何从节点模块导出异步函数
【发布时间】:2017-08-27 08:16:39
【问题描述】:

我正在尝试编写一个节点模块来处理我的各种数据库调用。 我想尽可能使用 async/await,但我遇到了一些问题。

我一直在使用 Promise,并且可以很好地导出这些函数。 示例:

function GetUsernames() {
    return new Promise(function (resolve, reject) {
        sql.connect(config).then(function () {
            new sql.Request()
                .query("SELECT [UserName] FROM [Users] ORDER BY [LastLogin] ASC").then(function (recordset) {
                    resolve(recordset);
                }).catch(function (err) {
                    reject(err);
                });
        });
    });
}

然后我导出如下:

module.exports = {
    GetUsernames: GetUsernames,
    GetScopes: GetScopes,
    UpdateToken: UpdateToken,
    SetOwner: SetOwner
};

但是,我应该如何使用 async 函数来使用 node7 中可用的 async/await?

我仍然只是返回一个承诺吗?我试过这样做,但是当我在我的代码中调用它时,它不起作用。

const db = require("dataprovider");
...
var result = await db.GetUsernames();

它给了我:

语法错误:意外的标识符

在数据库名称上(如果我只使用 promise 函数,使用 then() 可以正常工作。)

也许我的谷歌技能很糟糕,但在这个问题上,我没有设法用谷歌搜索任何我可以使用的东西。

究竟如何在我的模块中创建一个可以在其他地方等待的异步函数?

【问题讨论】:

    标签: node.js async-await


    【解决方案1】:

    要打开 await 关键字,您需要将它放在异步函数中。

    const db = require("dataprovider");
    ...
    let result = getUserNames();
    
    async function getUserNames() {
        return await db.GetUsernames();
    }
    

    更多信息请参见http://javascriptrambling.blogspot.com/2017/04/to-promised-land-with-asyncawait-and.html

    另外,作为一个 FYI,它是一个以小写字母开头的函数的代码约定,除非你从它返回一个类。

    【讨论】:

    • 我不确定这如何解决 module.exports 的问题。你能详细说明一下吗?
    • 抱歉,不清楚。您可以做两件事,然后可以添加上面的内容: Module.exports = { getUserNames: getUserNames } 或者您可以在模块导出中定义函数: module.exports = { getUserNames: async function () { return await db .getUserNames(); } }
    【解决方案2】:

    async - await 模式确实让您的代码更易于阅读。但是节点不允许全局等待。您只能等待异步流。您要做的是等待外部异步流。这是不允许的。这是节点应用程序的一种反模式。在处理 Promise 时,我们实际上做的是在我们的程序中生成一个异步流。我们的程序继续进行,无需等待承诺。因此,您可以将函数导出为异步,但不能在异步流之外等待它们。例如。

    const db = require('dataprovider');
    ...
    let result = (async () => await db.GetUserNames())();
    console.log(result); // outputs: Promise { <pending> }
    

    因此,async-await 模式适用于异步流。因此在异步函数中使用它们,以便节点可以异步执行它们。此外,您也可以等待 Promises。例如。

    let fn = async () => await new Promise( (resolve, reject)=>{...} );
    fn().then(...);
    

    在这里您已经创建了异步函数“fn”。这个功能是可以的。您也可以在另一个异步函数中等待“fn”。

    let anotherFn = async () => await fn();
    anotherFn().then(...);
    

    在这里,我们在异步函数中等待异步函数。 Async-Await 模式使您的代码具有可读性和简洁性。这反映在大型项目中。

    【讨论】:

      【解决方案3】:

      假设您在 baseoperation.ts 中有以下功能

      async function GetAllwithFilter(keyword?: any){
      //... async job here
      }
      

      然后您可以在 baseoperation.ta 的末尾添加以下代码 module.exports = { GetAllOrAnyName: GetAllwithFilter}

      在所需的类中,您可以使用它来调用它

      const objname = require('./baseoperation');
      

      要在 api 中使用 express 和 router 调用它,您可以将 route 函数与 get 一起使用,因为它是直接接受 promise 调用

      router.route('/').get((req,res) => { objname.GetUsernames().then(then(result => {
          res.json(result[0]);
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-06
        • 2019-10-28
        • 1970-01-01
        • 2018-07-25
        • 1970-01-01
        • 2014-11-04
        • 2021-10-12
        相关资源
        最近更新 更多