如何解决在嵌套函数中使用req.accept时,req是未定义的
我最近在使用内置req.accepts
,req.acceptsLanguages
,req.acceptsCharsets
和req.acceptsEncodings
函数时遇到了一个问题。
我有一个像这样的表达中间件功能:
function acceptCheckpoint(acceptOpts) {
// Calling the following function results in a TypeError.
function checkAccept(req,res,opts) {
let acceptFunction = null;
switch (opts.whichAccept) {
case "type":
acceptFunction = req.accepts;
break;
case "lang":
acceptFunction = req.acceptsLanguages;
break;
case "charset":
acceptFunction = req.acceptsCharsets;
break;
case "encoding":
acceptFunction = req.acceptsEncodings;
break;
default:
acceptFunction = req.accepts;
break;
}
return acceptFunction(opts.acceptedTypes);
}
return (req,next) => {
const accepted = [];
Object.getOwnPropertyNames(acceptOpts).forEach(key => {
if (key === "ignoreAcceptMismatch") { return; }
const acceptsType = checkAccept(req,{
whichAccept: key,acceptedTypes: acceptOpts[key]
});
accepted.push(acceptsType);
});
if (accepted.some(type => !type) && !acceptOpts.ignoreAcceptMismatch) {
res.type("html");
res.status(406);
res.send("<h1>406 Not Acceptable.</h1>");
return;
}
next();
};
}
理论上应该起作用。但是程序不断抱怨并记录此错误:
TypeError: Cannot read property 'headers' of undefined
at new Accepts (/Users/hortoncheng/Desktop/Programs/colonialwars/dev/node_modules/accepts/index.js:37:22)
at Accepts (/Users/hortoncheng/Desktop/Programs/colonialwars/dev/node_modules/accepts/index.js:34:12)
at req.accepts (/Users/hortoncheng/Desktop/Programs/colonialwars/dev/node_modules/express/lib/request.js:133:16)
at checkAccept (/Users/hortoncheng/Desktop/Programs/colonialwars/dev/Lib/middleware.js:208:12)
at /Users/hortoncheng/Desktop/Programs/colonialwars/dev/Lib/middleware.js:216:27
at Array.forEach (<anonymous>)
at /Users/hortoncheng/Desktop/Programs/colonialwars/dev/Lib/middleware.js:214:44
at Layer.handle [as handle_request] (/Users/hortoncheng/Desktop/Programs/colonialwars/dev/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/Users/hortoncheng/Desktop/Programs/colonialwars/dev/node_modules/express/lib/router/index.js:317:13)
at /Users/hortoncheng/Desktop/Programs/colonialwars/dev/node_modules/express/lib/router/index.js:284:7
问题是,当我在主函数(req.accepts
)中使用.accepts
或其中一个acceptCheckpoint
函数时,像这样:
// Pretend we're in acceptCheckpoint...
// This works.
accepted.push(req.accepts("html"));
有效。并且,当我将req
对象登录到这些函数中的任何一个中时,它都会返回预期值。我还尝试过将req
对象记录在express模块的request.js
文件中,并在那里返回了undefined
。因此,我认为表达本身就是一个问题。我尝试删除package-lock.json和node_modules,然后运行npm install
。没有解决。是的,我正确地调用了表达中间件函数。知道为什么会这样吗?
我正在使用Express v4.17.1,Node.JS v12.18.1和NPM v6.14.5。
解决方法
该函数可能正在尝试从其library(dplyr)
testdf %>% st_as_sf(coords = c("long","lat")) %>%
st_set_crs("+proj=longlat +datum=WGS84") %>%
st_transform("+proj=utm +zone=10 +ellps=GRS80 +datum=NAD83" )
上下文中获取flexDirection: 'row'
。但是您没有在上下文中传递函数。
更改此行:
df[df.col.str.contains("foo").fillna(False)]
收件人:
req
this
方法的第一个参数是被调用函数中应用作return acceptFunction(opts.acceptedTypes);
的对象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。