#node.js #express #dictionary #next.js
#node.js #экспресс #словарь #next.js
Вопрос:
У меня есть Next.js приложение с пользовательским сервером (Express), которое выполняет некоторые действия непрерывно и хранит некоторые данные в памяти до тех пор, пока сервер работает.
Я хочу получить доступ к этим данным из вызовов API (страниц). Каков правильный способ их хранения и доступа к ним?
Мой индексный файл сервера:
import { createServer } from 'http'
import express from 'express'
import { parse } from 'url'
import next from 'next'
import pinoHttp from 'pino-http'
const logger = pinoHttp()
const dev = process.env.NODE_ENV !== 'production'
const nextApp = next({ dev })
try {
const handle = nextApp.getRequestHandler()
const port = process.env.NODE_PORT || 3000
nextApp.prepare().then(() => {
const app = express()
app.locals.myArray = []
// Do stuff in the background that will update the array
createServer((request, response) => {
const parsedUrl = parse(request.url, true)
logger(request, response)
handle(request, response, parsedUrl)
}).listen(port, (error?: Error) => {
if (error) throw error
console.log(`Listening on: http://localhost:${port}`)
})
})
} catch (error) {
console.log(error)
process.exit(1)
}
Моя страница:
import { Request, Response } from 'express'
export default async function (request: Request, response: Response): Promise<void> {
// Here, request.app and response.app are both undefined.
}
Ответ №1:
Если ваши данные должны сохраняться только до тех пор, пока запущена ваша программа nodejs, вы можете сохранить их в ОЗУ с помощью объекта Map . Карты представляют собой наборы пар ключ / значение, очень похожие на словари C #, словари python или массивы php.
Вы можете создать этот объект только один раз при запуске, а затем присоединить его к своему экспресс app
-объекту следующим образом.
var app = express();
app.locals.myMap = new Map()
Затем в каждом обработчике маршрута вы можете ссылаться на него следующим образом.
const myMap = req.app.locals.myMap
Затем вы можете написать такой код:
let userdata = {}
const username = 'whatever'
if(myMap.has(username)) {
userdata = myMap.get(username)
}
...
myMap.set(username, userdata)
В этом конкретном примере userdata
объект сохраняется на карте для каждого username
.
Очевидно, что карта исчезает без следа, если ваш nodejs останавливается по какой-либо причине.
Вы можете поместить в них все, что вам нравится app.locals
; это не обязательно должна быть карта.
Комментарии:
1.
app.locals
кажется, это именно то, что я хочу, спасибо! Проблема в том, чтоres.app
на моей странице это не определено. Я обновил свой пост содержимым файлов.2. О, черт, извините, я имел в виду
req.app
. Отредактированный ответ.3. это также не определено, я чувствую, что чего-то не хватает из-за Next.js … :-/
4. Мой пример для express. К сожалению, я не знаком с next. Вы также можете использовать
globals.myArray
.5. Спасибо за вашу помощь. 😉