Node.js Область действия переменной Javascript в контексте маршрутизации - PullRequest
0 голосов
/ 14 сентября 2018

Если у меня есть этот код:

app.get("/location1", function(req, res){
   async_function().then(result => {
       var str = result.toString();
   }).catch(...).....
});

Внутри .then () функции asynchrouns есть переменные.

(result, str)

Могу ли я использовать эти переменные в другом маршруте, тогда?

app.get("/location2", function(req, res){
   result = ....;
   str = ...;
});

Разве область переменных не ограничена только функцией .then ()?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Разве область переменных не ограничена только внутри функции .then ()?

Да, к аргументам функции можно получить доступ только внутри самой функции.Однако вы можете присвоить этот аргумент глобальной переменной, к которой можно получить доступ в других функциях:

 let result; // global variable

 app.get("/location1", function(req, res){
   async_function().then(res => {
      result = res.toString(); // assign to global
   }).catch(/*...*/);
 });

Теперь эта глобальная переменная является общей для всех экземпляров .Это означает, что если один пользователь запрашивает location1, результат назначается для redult, а другой пользователь, запрашивающий location2, получает это.Чтобы решить эту проблему, вы должны сохранить результат, относящийся к некоторому токену пользователя, а затем пользователь может передать токен, чтобы получить свой результат:

 const results = {};

 // Loads the data into the results object 
 async function loadData(token) {
   const result = await async_function();
   results[token] = result;
 }

 app.get("load", (req, res) => {
   // Generate unique token:
   require('crypto').randomBytes(48, function(err, buffer) {
     var token = buffer.toString('hex');
     // Load data (fire & forget)
     loadData(token);
     // And respond with the token:
     res.json({ token });
   });
 });

 app.get("result/:token", (req, res) => {
   const { token } = req.params;
   if(results[token) {
     res.send( results[token] );
   } else {
    res.status(404).end("Not found :(");
   }
 });

Затем вы можете запросить /load и получить токен обратно.Например, 1234, вы можете опросить result/1234 и дождаться появления результата.

0 голосов
/ 14 сентября 2018

Это в значительной степени зависит от контекста вашего кода. Если вы просто хотите присвоить пользователю данные, которые можно использовать при посещении /location2, вы можете сохранить переменную в виде файла cookie. Затем с помощью промежуточного программного обеспечения cookie-parser вы можете легко прочитать данные из запроса.

app.get("/location1", function(req, res) {
    async_function().then(result => {
       var str = result.toString();
       res.cookie("str", str);    //store the str variable as a cookie with the name "str"
       res.send(200, 'ok')
    }).catch(...).....
});

app.get("/location2", function(req, res) {
    var str = req.cookies.str;    //save the value of the "str" cookie as a varable
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...