Как сохранить переменную перед обслуживанием файла в nodejs - PullRequest
0 голосов
/ 22 октября 2018

с учетом следующего кода:

 const https = require('https');
 const fs = require('fs');
 var path = require('path');
 const express = require('express');
 const app = express();
 const router = express.Router();
 const pool = require('./mysqldb.js');
 const pathView = __dirname + "/views/";
 const IMGPath = "/public";
 var bodyParser = require("body-parser");
 const listenPort = 8010;
 var id = null ;

 router.get('/details/:id', async function (req, res, next) {
 id = req.params.id;
 if ( typeof req.params.id === "number"){id = parseInt(id);}
 res.render('details.ejs' );
 });

Основная цель - сохранить этот req.params.id (идентификатор из URL-адреса) в переменной id перед передачей файла details.ejs. Я пыталсяудалить асинхронный, но не работает. Можете ли вы помочь мне, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Кажется, это работает нормально для меня.Ниже я запускаю этот сервер, затем перехожу на http://localhost:3050/123, и внезапно я снова и снова пытаюсь записать в журнал «123», и на экране появляется правильный текст.

Итак ... поинтересуйтесь, что еще, если вы собираетесь, но это может помочь, если вы приложите все усилия, чтобы перевести ваш код на самую простую итерацию, чтобы попытаться отладить.Просто попробуйте повторить это в другом месте.Вы можете обнаружить, что один из ваших дополнительных модулей вызывает проблему.

const express = require('express')
const app = express();
const port = 3050;

let id = null; 

app.get('/:id', (req, res) => {
    return res.send('Hello World!')
}); 

app.get('/details/:id', (req, res) => {
    if (req.params.id){
        id = req.params.id;
    }

    // 'id' will appear in browser
    return res.send(`See details for id: ${id}`); 
}); 

// console logs of 'id'
setInterval(() => { console.log(`id is currently ${id}`); }, 1000);

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

Не думаю, что async/await повлияет на эту конкретную проблему.Я сомневаюсь, что они связаны.

0 голосов
/ 23 октября 2018

Мне кажется, это работает,

router.get('/details/:id', async function (req, res, next) {
  id = typeof req.params.id === 'number' ? parseInt(id) : req.params.id;
  console.log(id);
  res.send('details.ejs' );
});
0 голосов
/ 23 октября 2018

Вы можете использовать ключевые слова await внутри вашей функции async следующим образом:

router.get('/details/:id', async function (req, res, next) {
    await (() => { id = req.params.id; })(); // Will run first
    await (() => { res.send(id); })(); // Will run second
})

res.send(id) или res.render('details.ejs') (в вашем случае) будет запущено после получения идентификатора

...