web-dev-qa-db-ja.com

Node.js Express.jsルーターに非同期関数を渡す

これは簡単なグーグルのようですが、私は答えを見つけることができないようです...

ES7非同期機能をExpressルーターに渡すことはできますか?

例:

var express = require('express');
var app = express();

app.get('/', async function(req, res){
  // some await stuff
  res.send('hello world');
});

そうでない場合、この問題のES7スタイルを処理する方法について正しい方向を教えてもらえますか?それとも私は約束を使用する必要がありますか?

ありがとう!

10
ForgetfulFellow

async/awaitES7 ES6機能ではないため、結果が見つからなかった可能性があります。ノード> = 7.6で使用できます。

コードはノードで動作します。次のコードをテストしました

var express = require('express');
var app = express();

async function wait (ms) {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, ms)
  });
}

app.get('/', async function(req, res){
  console.log('before wait', new Date());
  await wait(5 * 1000);
  console.log('after wait', new Date())
  res.send('hello world');
});

app.listen(3000, err => console.log(err ? "Error listening" : "Listening"))

そして出来上がり

MacJamal:messialltimegoals dev$ node test.js 
Listening undefined
before wait 2017-06-28T22:32:34.829Z
after wait 2017-06-28T22:32:39.852Z
^C

基本的にあなたはそれを手に入れました、あなたはそのコード内のpromiseでasyncするためにawait関数を持っている必要があります。これはノードLTS v6ではサポートされていないため、コードをトランスパイルするためにbabelを使用できます。お役に立てれば。

11
JBoulhous

例外がキャッチされず、例外がスローされても関数が返らないため、直接実行することはできないと思います。この記事では、ラッパー関数を作成して機能させる方法について説明します。 http://thecodebarbarian.com/using-async-await-with-mocha-express-and-mongoose.html

まだ試していませんが、最近調査中です。

2
Digby

express-promise-router を使用します。

const express = require('express');
const Router = require('express-promise-router');
const router = new Router();   
const mysql = require('mysql2');

const pool = mysql.createPool({
  Host: 'localhost',
  user: 'myusername',
  password: 'mypassword',
  database: 'mydb',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
}).promise();

router.get('/some_path', async function(req, res, next) {
  const [rows, ] = await pool.execute(
    'SELECT * ' +
    'FROM mytable ',
    []
  );

  res.json(rows);
});

module.exports = router;

(上記は、mysql2のpromiseインターフェースをexpress-promise-routerで使用する例です。)

0
fadedbee
​

​----------------------------------------------------------------------------------------------------------------
​async function GetTripSummary(trip_id, vin, job_id)
{
    return new Promise((resolve, reject) => {
        var tid = "Some-ID";
        var options = {
            "method": "GET",
            "hostname": "automotive.internetofthings.ibmcloud.com",
            "port": 443,
            "path": "/driverinsights/drbresult/tripSummaryList?trip_id=" + trip_id + "&tenant_id=" + tid + "&mo_id=" + vin + "&job_id=" + job_id,
            "headers": {
                "accept": "application/json",
                "content-type": "application/json",
                'Authorization': 'Basic ' + new Buffer("Something" + ':' + "Something").toString('base64')
            }
        };
        var req = https.request(options, function (res) {
            var chunks = [];
            res.on("data", function (chunk) {
                chunks.Push(chunk);
            });
            res.on("end", function () {
                var body = Buffer.concat(chunks);
                console.log("[1]Map Matched Data Received From ContextMapping: \n\t")
                console.log(body.toString());
                var data = JSON.parse(body);
                resolve(data);
            });
            res.on('error', function (e) {
                reject('problem with request: ' + e.message);
            });
        });
        req.end();
    });
}
​
​----------------------------------------------------------------------------------------------------------------
​
​

    router.get('/cgcc/trip/start/:vin/:uid/:tripid', async function(req, res)
    {   
        try {
            var lvin = req.params.vin;
            var user_id = req.params.uid;
            var trip_id = req.params.tripid;

            CC_Trip.find({ trip_id: trip_id, user_id: user_id, vin: lvin }, function (err, trips) {
                //! A given user with same phone number exists*/
                if ((trips == undefined) || (trips.length <= 0) || (err != null)) {
                    //! End Processing
                    res.send({
                        "user":
                        {
                            "responseCode": "409",
                            "userId": trip_id,
                            "messasge": "Trip does not exist"
                        }
                    });
                }
                else  //! User Exists
                {
                    if (trips[0].moma_job_status == "SUCCEEDED") {
                        const response = await GetTripSummary(trips[0].trip_id, trips[0].vin, trips[0].moma_job_id);
                        return response;
                    }
                    else {
                        res.send({
                            "user":
                            {
                                "responseCode": "301",
                                "userId": trip_id,
                                "messasge": "Background Analysis still going on"
                            }
                        });
                    }
                }
            });
        }
        catch (e)
        {
            console.log(body.toString());
        }
    });
    ​

​===========================================================================================================================
​I keep on getting this error while compiling
​
​const response = await GetTripSummary(trips[0].trip_id, trips[0].vin, trips[0].moma_job_id);
                                           ^^^^^^^^^^^^^^

SyntaxError: Unexpected identifier
    at createScript (vm.js:74:10)
    at Object.runInThisContext (vm.js:116:10)
    at Module._compile (module.js:533:28)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:503:32)
    at tryModuleLoad (module.js:466:12)
    at Function.Module._load (module.js:458:3)
    at Module.require (module.js:513:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (D:\PES_CC_POC\app.js:18:13)
    at Module._compile (module.js:569:30)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:503:32)
    at tryModuleLoad (module.js:466:12)
    at Function.Module._load (module.js:458:3)
    at Module.require (module.js:513:17)
Waiting for the debugger to disconnect...
​​===========================================================================================================================
0
Abhishek Dhar