sinneren
@sinneren

Nuxt: Что не так с asyncData и req?

В serverMiddleware я добавляю к request данные, например:
export default function (req, res, next) {
...
req.newdata = data;
next();
}

В компоненте страницы я получаю эти данные и вывожу:
<template> {{ viewdata }}</template>
<script>
export default {
  asyncData( {req} ) {
    const { newdata } = req;
    return {
       viewdata: newdata,
    }
  }
}
</script>


Теперь проблема:
Если я перейду по ссылке на страницу, то выходит ошибка:
Cannot read property 'newdata' of undefined`
Но стоит мне обновить страницу - всё ок. Каждый раз при переходе через раутер - ошибка.

Код раутера, сделанный как мидлваря:
export default function ({ req, redirect }) {
    if (!req) return;

    const redirects = [
        {
            from: /^\/catalog-([\d]+)(\/?)(.*)$/,
            to: '/catalog/$1/',
        },
    ];

    const redirect_object = redirects.find(r => {
        return req.url.match(r.from);
    });

    if (redirect_object) {
        const code = req.url.match(redirect_object.from)[1];

        return redirect(308, redirect_object.to.replace('$1', code));
    }
}

Ссылки на страницу делаются через NLink.

Примерно то же самое происходит у меня на главной, там тоже asyncData, но уже работа с process:
return { config: JSON.stringify(JSON.parse(process.env.nuxtEnvConfig), null, 4) };

И ошибка отличается: Unexpected token u in JSON at position 0
Полагаю, они связаны.

пысы: запускается через сервер express, код стандартный:
const express = require('express');
const consola = require('consola');
const { Nuxt, Builder } = require('nuxt');
const app = express();

const config = require('../nuxt.config.js');
config.dev = process.env.NODE_ENV !== 'production';

async function start () {
    const nuxt = new Nuxt(config);
    const { host, port } = nuxt.options.server;

    if (config.dev) {
        const builder = new Builder(nuxt);
        await builder.build();
    } else {
        await nuxt.ready();
    }

    app.use(nuxt.render);
    app.listen({ port, host }, function () {
        process.send('ready');
    });

    consola.ready({
        message: `Server listening on http://${host}:${port}`,
        badge: true,
    });

}

start();
  • Вопрос задан
  • 704 просмотра
Решения вопроса 1
sinneren
@sinneren Автор вопроса
Понятно... данные получать надо проверив process.server в asyncData. Ссылку на страницу надо сменить на нативную вместо nlink
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы