【问题标题】:How to use async await as module method如何使用异步等待作为模块方法
【发布时间】:2017-02-11 04:09:48
【问题描述】:

这是我使用 Express 编写的路线

const express=require('express');
const router=express.Router();

const trackRepo=require('../model/track');

router.post('/live',function(req,res){
    const time=1439832167;
    const list=trackRepo.getAlerts(time);
    res.json({list:list});
});

module.exports=router;

我使用异步/等待的地方:

const r=require('rethinkdb');
const config=require('../config/rethinkdb');

r.connect(config).then((conn)=>{
    module.exports.getAlerts=async (function(time){
        const cursor=await r.table('track').filter({createdAt:time}).run(conn);
        return await cursor.toArray();
    });
});

这是我的app.js

const express=require('express');
const app=express();
const server=require('http').createServer(app);
const bodyParser=require('body-parser');
const cookieParser=require('cookie-parser');
const session=require('express-session');

// Utilities
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());
app.use(cookieParser());

// Template
app.set('view engine','ejs');

// Static
app.use(express.static(__dirname+'/static'));

// Middlewares
app.use(require('./route/web'));
app.use(require('./route/track'));

// Listening
app.listen(4444,function(){
    console.log('Server listening on port 4444...');
});

我写了一个名为server.js的文件,这应该是入口点,在运行服务器之前将app.js转译成babel

require('babel/register');
require('./app.js');

这是我在 package.json 中安装的 devDependencies 列表

 "devDependencies": {
    "babel-cli": "^6.16.0",
    "babel-core": "^6.17.0",
    "babel-plugin-syntax-async-functions": "^6.13.0",
    "babel-plugin-transform-async-to-generator": "^6.16.0",
    "babel-plugin-transform-regenerator": "^6.16.1",
    "babel-polyfill": "^6.16.0",
    "babel-preset-es2015": "^6.16.0",
    "babel-preset-latest": "^6.16.0"
  }

当我使用命令babel-node server.js 启动服务器时,它会在异步等待行中抛出Unexpected token。我按照我搜索的指南并感到困惑,我不明白为什么它不断抛出错误。我该如何解决这个问题?

【问题讨论】:

  • 是await r.table('track'),标记为异步函数吗?,哦,..我很确定toArray();也不是 aysnc 方法。
  • 我是(async function(time){

标签: javascript node.js express asynchronous babeljs


【解决方案1】:

由于语法错误 async(function(){ await … }) 调用了一个名为 async 的函数,该函数使用函数表达式作为参数,但该函数表达式使用 await 关键字,尽管被标记为 @987654324,您会收到异常@。

应该是

router.post('/live', async function(req,res){
    const time = 1439832167;
    const list = await trackRepo.getAlerts(time);
//               ^^^^^ it's a promise, so you need to await it
    res.json({list:list});
});

const r = require('rethinkdb');
const config = require('../config/rethinkdb');

const connection = r.connect(config);
module.exports.getAlerts = async function(time) {
//                         ^^^^^^^^^^^^^^ two keywords, nothing between
    const conn = await connection;
//               ^^^^^^^^^^^^^^^^ don't export functions asynchronously, just wait inside it
    const cursor = await r.table('track').filter({createdAt:time}).run(conn);
    return await cursor.toArray();
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2018-03-12
    • 2013-02-15
    • 2013-07-24
    • 1970-01-01
    相关资源
    最近更新 更多