Fastify дает реактивную опору для рендера следующим. js - PullRequest
1 голос
/ 08 января 2020

Я использую пример сервера Next. js с Fastify и экспериментирую с ним, и мне интересно, есть ли способ передать, скажем, объект JSON в качестве опоры в рендер? Я пытался найти что-нибудь в документации и не могу ничего найти для этого.

Используемый мной код сервера:

const fastify = require('fastify')();
const Next = require('next');

const port = parseInt(process.env.PORT, 10) || 3000;
const dev = process.env.NODE_ENV !== 'production';

fastify.register((fastify, opts, next) => {
    const app = Next({ dev })
    app.prepare().then(() => {

        fastify.get('/', (req, res) => {
            let object = {"hello": "world"}; // object I want to pass as a prop
            return app.render(req.req, res.res, '/index', req.query).then(() => {
                res.sent = true
            })
        })

        next()
    }).catch(err => next(err))
})

fastify.listen(port, err => {
    if (err) throw err
    console.log(`Ready on http://localhost:${port}`)
})

1 Ответ

1 голос
/ 08 января 2020

Ваш вопрос не конкретизирован c до Fastify, но относится ко всем серверным платформам.

Основная идея c состоит в том, что req & res объект передается в Next getInitialProps.

Таким образом, вы можете поместить в них свои данные.

Например, у объекта Response express есть атрибут locals, который задает c для этого задания.

Итак, чтобы передать данные, прикрепите их к требованию.

fastify.get('/', (req, res) => {
  const object = { hello: 'world' }; // object I want to pass as a prop
  res.res.myDataFromController = object;
  return app.render(req.req, res.res, '/index', req.query).then(() => {
    res.sent = true;
  });
});
// some next page.jsx

const IndexPage = ({ dataFromGetInitilProps }) => (
  <div> {JSON.stringify(dataFromGetInitilProps, null, 2)} </div>
);

IndexPage.getInitilProps = ctx => {
  const { res } = ctx;

  // res will be on the context only in server-side
  const dataFromGetInitilProps = res ? res.myDataFromController: null; 

  return {
    dataFromGetInitilProps: res.myDataFromController,
  };
};

export default IndexPage;
...