gpt4 book ai didi

javascript - 尝试使用 .apply() 时在非对象上调用 CreateListFromArrayLike 时出现错误

转载 作者:IT王子 更新时间:2023-10-29 03:20:17 24 4
gpt4 key购买 nike

我创建了一个简单的小路由解析函数,这样我就可以保持我的代码干净且易于维护,这是在应用程序启动并解析 config.json 时运行的小函数> 文件并绑定(bind)适当的方法和请求路径:

const fs = require('fs');
const path = require('path');
module.exports = function(app, root) {
fs.readdirSync(root).forEach((file) => {
let dir = path.resolve(root, file);
let stats = fs.lstatSync(dir);
if (stats.isDirectory()) {
let conf = require(dir + '/config.json');
conf.name = file;
conf.directory = dir;
if (conf.routes) route(app, conf);
}
})
}

function route(app, conf) {
let mod = require(conf.directory);

for (let key in conf.routes) {
let prop = conf.routes[key];
let method = key.split(' ')[0];
let path = key.split(' ')[1];

let fn = mod[prop];
if (!fn) throw new Error(conf.name + ': exports.' + prop + ' is not defined');
if (Array.isArray(fn)) {
app[method.toLowerCase()].apply(this, path, fn);
} else {
app[method.toLowerCase()](path, fn);
}
}
}

我遇到的问题是有时我需要将多个参数传递给快速路由器,例如在使用护照的情况下是这样的:

exports.authSteam = [
passport.authenticate('facebook', { failureRedirect: '/' }),
function(req, res) {
res.redirect("/");
}
];

所以我想我可以将它们作为数组传递,然后将它们适本地解析到路由器中,例如我的配置如下所示:

{
"name": "Routes for the authentication",
"description": "Handles the authentication",
"routes": {
"GET /auth/facebook": "authFacebook",
"GET /auth/facebook/return": "authFacebookReturn"
}
}

唯一的问题是我遇到了这个错误:

     app[method.toLowerCase()].apply(this, path, fn);
^

TypeError: CreateListFromArrayLike called on non-object

如果我 console.log(fn) 我看到 [ [Function: authenticate], [Function] ]

我不确定我做错了什么,任何信息都会非常感谢。

最佳答案

您需要将参数作为数组发送,如下所示:

app[method.toLowerCase()].apply(this, [path, fn]);

如果你想发送一个参数列表你需要使用调用:

app[method.toLowerCase()].call(this, path, fn);

来源:call , apply

关于javascript - 尝试使用 .apply() 时在非对象上调用 CreateListFromArrayLike 时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41354099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com