#node.js
Вопрос:
Я пытаюсь закодировать веб-сервер в простых NodeJS с помощью http. То, что я пытаюсь сделать, — это когда у вас есть URL /добавить/, что бы ни было после того, как /добавить/ будет добавлено в массив, и отображается на/, но массив не сохраняется, и сбрасывает его, когда я добавляю что-то новое. Может кто-нибудь объяснить, что я сделал не так?
Извините, что мой код немного запутан.
Index.js:
const http = require('http');
const $conf = require('./config.json');
http.createServer((req, res) => {
let $list = [];
const url = req.url;
const $req = url.split('/');
const $req_q = url.split('?');
if (req.url == "/"){
res.write($list.toString());
} else if (req.url == `/add/${$req[2]}`){
$list.push($req[2])
console.log($list)
res.write(`ADDED ${$req[2]}`)
} else {
res.write('Error');
}
res.end();
}).listen($conf.port);
Конфигурация.json:
{
"port": 80
}
Когда я получаю /добавляю/привет
, я получаю «ДОБАВЛЕНО привет».
Затем вернитесь в / и ничего не получите.
Комментарии:
1. Консоль. войдите в
else if
блок, выводится ли он на консоль?
Ответ №1:
Веб-сервер NodeJS выполняет маршрут (например '/'
, или '/add'
) по требованию. Это означает, что все внутри функции выполняется с нуля по каждому запросу.
Поэтому ваша $list
переменная инициализируется каждый раз, когда вы вызываете маршрут, и вы не можете видеть результат на экране.
Вы можете исправить это, переместив переменную в глобальную область.
const http = require('http');
const $conf = require('./config.json');
let $list = []; // Now this value is persisted between requests
http.createServer((req, res) => {
const url = req.url;
const $req = url.split('/');
const $req_q = url.split('?');
if (req.url == "/"){
res.write($list.toString());
} else if (req.url == `/add/${$req[2]}`){
$list.push($req[2])
console.log($list)
res.write(`ADDED ${$req[2]}`)
} else {
res.write('Error');
}
res.end();
}).listen($conf.port);
Комментарии:
1. Я не уверен, будет ли это очевидно или нет для OP, но, по крайней мере, было бы полезно указать, что это
$list
разделяется между всеми клиентами, получающими доступ к веб-серверу, и не является отдельным для каждого клиента.
Ответ №2:
Основная причина заключается в том, что массив $list инициализируется каждый раз при поступлении нового запроса. Таким образом, на данный момент может быть два способа сделать это.
- Создайте переменную за пределами этой области маршрута, чтобы вы могли получить доступ к предыдущему значению. (эта переменная будет общей для каждого запроса/клиента)
- Другим и более эффективным способом является более эффективное хранение значения с помощью node-json-db, так как могут быть тысячи запросов, для которых вам может потребоваться сохранить эти данные, и в это время это будет неэффективно. Вы можете использовать node-json-db.
Пример кода:
import { JsonDB } from 'node-json-db';
import { Config } from 'node-json-db/dist/lib/JsonDBConfig'
// The first argument is the database filename. If no extension, '.json' is assumed and automatically added.
// The second argument is used to tell the DB to save after each push
// If you put false, you'll have to call the save() method.
// The third argument is to ask JsonDB to save the database in an human readable format. (default false)
// The last argument is the separator. By default it's slash (/)
var db = new JsonDB(new Config("myDataBase", true, false, '/'));
// Pushing the data into the database
// With the wanted DataPath
// By default the push will override the old value
db.push("/test1","super test");
// Get the data from the root
var data = db.getData("/");
// From a particular DataPath
var data = db.getData("/test1");
// If you try to get some data from a DataPath that doesn't exists
// You'll get an Error
try {
var data = db.getData("/test1/test/dont/work");
} catch(error) {
// The error will tell you where the DataPath stopped. In this case test1
// Since /test1/test does't exist.
console.error(error);
};
Есть несколько других операций, которые вы можете выполнить, для этого вам следует проверить его документацию.