Express app.allは、req / resとnotを宣言します

ニックウォン

エクスプレスでは、他のすべてが一定に保たれていますが、次の間に違いがあります。

app.all('/', mongoProxy(config.mongo.dbUrl, config.mongo.apiKey));

そして

app.all('/', function (req, res) {
  mongoProxy(config.mongo.dbUrl, config.mongo.apiKey);
 });

前者はからの戻り値を返すことができますがmongoProxy、後者はそうではありません。mongoProxy次のようになります。

module.exports = function(basePath, apiKey) {

  basePath = url.parse(basePath);

  // Map the request url to the mongolab url
  // @Returns a parsed Url object
  var mapUrl = module.exports.mapUrl = function(reqUrlString) {
    //use the basePath to Parse the URL
    return newUrl;
  };

  var mapRequest = module.exports.mapRequest = function(req) {
    var newReq = mapUrl(req.url);
    // Make a new request and return it..
    return newReq;
  };

  var proxy = function(req, res, next) {
    try {
      var options = mapRequest(req);
      // Create the request to the db
      var dbReq = https.request(options, function(dbRes) {
         // Save result 
        });
          // { send result }
          res.send(data);
          res.end();
        });
      });
      // send request 
      dbReq.end(JSON.stringify(req.body));
    } catch (error) {
      //..
    }
  };
  return proxy;
};

ドキュメントは、2つの概念の違いを説明する上で明確ではありません。私が見た例では、前者の機能

app.all('/', mongoProxy(config.mongo.dbUrl, config.mongo.apiKey));

後者のように実際に渡されることなく、reqおよびresオブジェクトにアクセスできますfunction (req, res)

2つの違いは何ですか?1つが望ましいですか?

ロイス

tl; dr

はい、違いがあります。最初の関数は機能しますが、2番目の関数はハングします(によって返される匿名関数を呼び出さないでくださいmongoProxy)。表現するのがより慣用的であるため、最初の方が望ましいです(ミドルウェアを使用しています)。


まず、ノート方法ではmongoProxy、あなたreturn proxy、無名関数:

module.exports = function(basePath, apiKey) {
  /* snip */
  var proxy = function(req, res, next) { // <-- here
  /* snip */
  };
  return proxy;    // <-- and here
};

それを分解しましょう:

var proxy = mongoProxy(config.mongo.dbUrl, config.mongo.apiKey)
// proxy is an anonymous function which accepts: (req, res, next)

app.all('/', proxy);
// express will use proxy as the callback (middleware), which means this is the same as:
app.all('/', function (req, res, next) {
    proxy(req, res, next)
})

2番目の例を書き直してみましょう。これにより、機能しない理由が明確になります。

var proxy = mongoProxy(config.mongo.dbUrl, config.mongo.apiKey)
app.all('/', function (req, res) {
    proxy    // nothing happens because you don't invoke the function
});

あなたは第二の例を使用する場合は、呼び出すことができproxyproxy(req, res, next)、これは(一般的には、特に明示のために)慣用的ではありません。Expressはすべてミドルウェアに関するものなので、最初の例を使用してください。

これは、クロージャを使用する別の例です(mongoProxy関数とよく似ています)。

function getPermissionLevelMiddleware (level) {
    // returns an anonymous function which verifies users based on `level`
    return function (req, res, next) {
        if (req.isAuthenticated() && req.user.permission.level > level)
            return next()
        return res.redirect('/no/permission')
    }
}

var isAdmin = getPermissionLevelMiddleware(9000)
// `isAdmin` only allows users with more than 9000 `user.permission.level`
var isPleb = getPermissionLevelMiddleware(1)
// `isPleb` allows users with more than 1 `user.permission.level`

app.get('/admin', isAdmin, function (req, res) {
    res.render('admin.jade')
})

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Express app.localsは、res.sendで送信すると未定義を返します

分類Dev

Express app.get:req.bodyは、実際の値ではなく、値のタイプを返します

分類Dev

Expressでのreq.sessionとreq.appおよびapp.setの違い

分類Dev

ExpressとAppを分割する目的はありますか?

分類Dev

app.set関数は何をしますか(express.js)?

分類Dev

Express + Postman、req.bodyは空です

分類Dev

app.getまたはapp.allをExpressで使用する必要があります

分類Dev

Expressのapp.use( '*')とapp.all( '*')の違い

分類Dev

Express-req.ipは127.0.0.1を返します

分類Dev

Expressミドルウェアのreq.locals対res.locals対res.data対req.data対app.locals

分類Dev

NodeとExpressはjsonを送信します

分類Dev

Expressはapp.listenまたはサーバーなしで機能します

分類Dev

Express組み込みパーサーは空のreq.bodyを返します

分類Dev

NodeJS / Express:「app.use」とは何ですか?

分類Dev

express.Router()とapp.get

分類Dev

Node + Express:Expressは各リクエストハンドラーのreqオブジェクトとresオブジェクトのクローンを作成しますか?

分類Dev

Expressはapp.getを使用できません

分類Dev

express js 4-app.configureなしで設定する方法は?

分類Dev

app.postは機能していますが、app.useは機能していません。Expressノード

分類Dev

ExpressとEJSでres.renderまたはres.redirectを使用する必要がありますか?

分類Dev

Expressのミドルウェアを介して `app`メソッドを追加することは可能ですか?

分類Dev

Express.js:req.bodyのVALUEではなくreq.bodyオブジェクトのKEYとしてデータをPOSTしますか?

分類Dev

Node.js / Express.js-app.routerはどのように機能しますか?

分類Dev

Express req.on( 'end'、...)は起動されません

分類Dev

Express body-parser req は表示されません

分類Dev

express.Routerとapp.getの違いは?

分類Dev

Express + Passport.js:req.userは未定義です

分類Dev

Express-`req.body`は常に空です

分類Dev

Express 4 POST - req.body.some_property は未定義です

Related 関連記事

  1. 1

    Express app.localsは、res.sendで送信すると未定義を返します

  2. 2

    Express app.get:req.bodyは、実際の値ではなく、値のタイプを返します

  3. 3

    Expressでのreq.sessionとreq.appおよびapp.setの違い

  4. 4

    ExpressとAppを分割する目的はありますか?

  5. 5

    app.set関数は何をしますか(express.js)?

  6. 6

    Express + Postman、req.bodyは空です

  7. 7

    app.getまたはapp.allをExpressで使用する必要があります

  8. 8

    Expressのapp.use( '*')とapp.all( '*')の違い

  9. 9

    Express-req.ipは127.0.0.1を返します

  10. 10

    Expressミドルウェアのreq.locals対res.locals対res.data対req.data対app.locals

  11. 11

    NodeとExpressはjsonを送信します

  12. 12

    Expressはapp.listenまたはサーバーなしで機能します

  13. 13

    Express組み込みパーサーは空のreq.bodyを返します

  14. 14

    NodeJS / Express:「app.use」とは何ですか?

  15. 15

    express.Router()とapp.get

  16. 16

    Node + Express:Expressは各リクエストハンドラーのreqオブジェクトとresオブジェクトのクローンを作成しますか?

  17. 17

    Expressはapp.getを使用できません

  18. 18

    express js 4-app.configureなしで設定する方法は?

  19. 19

    app.postは機能していますが、app.useは機能していません。Expressノード

  20. 20

    ExpressとEJSでres.renderまたはres.redirectを使用する必要がありますか?

  21. 21

    Expressのミドルウェアを介して `app`メソッドを追加することは可能ですか?

  22. 22

    Express.js:req.bodyのVALUEではなくreq.bodyオブジェクトのKEYとしてデータをPOSTしますか?

  23. 23

    Node.js / Express.js-app.routerはどのように機能しますか?

  24. 24

    Express req.on( 'end'、...)は起動されません

  25. 25

    Express body-parser req は表示されません

  26. 26

    express.Routerとapp.getの違いは?

  27. 27

    Express + Passport.js:req.userは未定義です

  28. 28

    Express-`req.body`は常に空です

  29. 29

    Express 4 POST - req.body.some_property は未定義です

ホットタグ

アーカイブ