Next.js : как сохранить данные на стороне сервера, чтобы получить к ним доступ из вызовов страниц

#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. Спасибо за вашу помощь. 😉