Javascript 如何在nextjs api中从浏览器读取cookie

Javascript 如何在nextjs api中从浏览器读取cookie,javascript,reactjs,next.js,Javascript,Reactjs,Next.js,我正在layout.js组件中设置cookie,并可以在浏览器中看到它 我有我的api,我希望能够在发布帖子时读取cookie,然后使用该值执行一些操作 我尝试了几个不同的包来实现这一点,我得到了“未定义”的cookie值 如何读取api.js文件中cookie的值 Layout.js useEffect(() => { document.cookie = 'tagrid=322323932; path=/' }) const bodyParser = require(&q

我正在layout.js组件中设置cookie,并可以在浏览器中看到它

我有我的api,我希望能够在发布帖子时读取cookie,然后使用该值执行一些操作

我尝试了几个不同的包来实现这一点,我得到了“未定义”的cookie值

如何读取
api.js
文件中cookie的值

Layout.js

 useEffect(() => {
    document.cookie = 'tagrid=322323932; path=/'
  })
const bodyParser = require("body-parser");

var cookieParser = require("cookie-parser");
var express = require('express');
const app = express();
app.use(cookieParser());

app.get('/', function(req, res){

  console.log('Cookies: ', req.cookies)

});
//Here we are configuring express to use body-parser as middle-ware.
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.listen(4000,() => {
  console.log("Started on PORT 4000");
})
页面/api.js

// import cookies from 'next-cookies'
import cookieCutter from 'cookie-cutter'
import Cookies from 'cookies'


// const cook = Object.keys(cookies).map((name) => cookies[name].toString())

export default async (req, res) => {
  const { method, body } = req
  if (method === 'POST') {
    res.statusCode = 200
    res.setHeader('Content-Type', 'application/json')
    res.end(
      JSON.stringify({
        msg: body,
      }),
    )
    try {
      const cook = cookies.get('tagrid')
      // read cookie value
      console.log('cook', cook)
    } catch (error) {
      console.error(error)
    }
  } else {
    res.status(200)
  }
}
express.js

 useEffect(() => {
    document.cookie = 'tagrid=322323932; path=/'
  })
const bodyParser = require("body-parser");

var cookieParser = require("cookie-parser");
var express = require('express');
const app = express();
app.use(cookieParser());

app.get('/', function(req, res){

  console.log('Cookies: ', req.cookies)

});
//Here we are configuring express to use body-parser as middle-ware.
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.listen(4000,() => {
  console.log("Started on PORT 4000");
})

cookie解析器旨在用作快速中间件,但大多数中间件也可以直接用作函数

通常,您会在express中使用它,如下所示:

app.use(cookieParser());
但是如果您仔细想想,app.use会接受一个函数,并将参数
req、res、next
传递给该函数。您还可以传递它
req、res
,以及回调函数(回调函数不接收任何参数)

要在服务器端脚本中使用cookie解析器,请执行以下操作:

从“cookie解析器”导入{cookieParser}
导出默认异步(req,res)=>{
常量回调=()=>{
const cook=req.cookies['tagrid'];
控制台日志(库克);
};
cookieParser()(req、res、回调);
};

我没有答案,但可能有一个有用的提示:并非所有cookie都可以通过JavaScript读取。例如,我在express会话中设置了一个cookie,并显式地将cookie配置为不可通过JS访问。我认为,这是用户的一个安全层,这样Cookie就不会被恶意脚本“窃取”。(在我的开发工具中,这由标记“http only”表示)您是否尝试打印文档。当i tryhttp only未勾选时,cookiedocument未定义,因此我认为应该可以访问它。因此,我想我需要向服务器发送GET请求以获取cookie?您的api.js文件是客户端文件吗?在我看来,由于req和res参数以及“import”(这是一种节点功能)的使用,它看起来像是服务器端的。我认为在api.js中,您可以使用cookie解析器中间件来允许您通过req.cookies访问cookie。我认为您可以通过执行
cookieParser()(req,res,function(req,res){//your function using the cookie via req.cookies})直接使用中间件(无需express)
我的api是服务器端,但是我不确定是否可以实现cookie解析器中间件,或者至少我不确定如何实现,因为它是一个nextjs服务器。