web-dev-qa-db-fra.com

Passer des fonctions Async au routeur Node.js Express.js

Cela ressemble à un google simple, mais je n'arrive pas à trouver la réponse ...

Pouvez-vous transmettre les fonctions asynchrones ES7 au routeur Express?

Exemple:

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

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

Sinon, pouvez-vous me diriger dans la bonne direction sur la façon de gérer ce problème de style ES7? Ou dois-je simplement utiliser des promesses?

Merci!

10
ForgetfulFellow

Il se peut que vous n'ayez pas trouvé de résultats car async/await est une fonction ES7 et non ES6, elle est disponible dans le nœud> = 7.6.

Votre code fonctionnera dans le nœud. J'ai testé le code suivant

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"))

Et voila

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

Fondamentalement, vous l'avez, vous devez async une fonction pour await sur une promesse à l'intérieur de son code. Ceci n'est pas pris en charge dans le nœud LTS v6, il peut donc être utilisé babel pour transpiler le code. J'espère que cela t'aides.

11
JBoulhous

Je pense que vous ne pouvez pas le faire directement car les exceptions ne sont pas prises et la fonction ne reviendra pas si une est levée. Cet article explique comment créer une fonction wrapper pour la faire fonctionner: http://thecodebarbarian.com/using-async-await-with-mocha-express-and-mongoose.html

Je ne l'ai pas essayé, mais j'enquêtais récemment.

2
Digby

Utilisez 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;

(Ce qui précède est un exemple d'utilisation de l'interface de promesse de mysql2 avec 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