gpt4 book ai didi

javascript - Node.js - TypeError : res. json 不是函数(在某些路由中工作,在其他路由中不起作用)

转载 作者:行者123 更新时间:2023-12-03 00:35:23 24 4
gpt4 key购买 nike

在 MERN 堆栈(Mongo、Express、React、Node)中工作并在我的 API 中遇到错误。

这是我的 plaid.js 文件,其中我的路线之一引发了此错误。当然,我已经删除了所有 secret token 变量,但假设一切正常,直到出现 res.json 错误(确实如此)。

        const express = require("express");
const plaid = require("plaid");
const router = express.Router();
const jwt = require("jsonwebtoken");
const keys = require("../../config/keys");
const passport = require("passport");
const moment = require("moment");
const mongoose = require("mongoose");

// Load Account and User models
const Account = require("../../models/Account");
const User = require("../../models/User");

// Replaced my actual keys with empty strings for sake of this post
const PLAID_CLIENT_ID = "";
const PLAID_SECRET = "";
const PLAID_PUBLIC_KEY = "";

const client = new plaid.Client(
PLAID_CLIENT_ID,
PLAID_SECRET,
PLAID_PUBLIC_KEY,
plaid.environments.sandbox,
{ version: "2018-05-22" }
);

var PUBLIC_TOKEN = null;
var ACCESS_TOKEN = null;
var ITEM_ID = null;

// @route POST api/plaid/accounts/add
// @desc Trades public token for access token and stores credentials in database
// @access Private
router.post(
"/accounts/add",
passport.authenticate("jwt", { session: false }),
(req, res) => {
PUBLIC_TOKEN = req.body.public_token;

const userId = req.user.id;
const institution = req.body.metadata.institution;
const { name, institution_id } = institution;

if (PUBLIC_TOKEN) {
client
.exchangePublicToken(PUBLIC_TOKEN)
.then(res => {
ACCESS_TOKEN = res.access_token;
ITEM_ID = res.item_id;

// Check if account already exists for specific user
Account.findOne({
userId: req.user.id,
institutionId: institution_id
})
.then(account => {
if (account) {
console.log("Account already exists");
} else {
const newAccount = new Account({
userId: userId,
publicToken: PUBLIC_TOKEN,
accessToken: ACCESS_TOKEN,
itemId: ITEM_ID,
institutionId: institution_id,
institutionName: name
});

// TO:DO fix error, res.json is not a function
newAccount.save().then(account => res.json(account));
}
})
.catch(err => console.log(err)); // Mongo Error
})
.catch(err => console.log(err)); // Plaid Error
}
}
);
module.exports = router;

newAccount.save() 执行得很好,但后续的 res.json 会抛出错误。这是我返回的错误。也就是说,res.json 不是一个函数

[0] (node:23413) UnhandledPromiseRejectionWarning: TypeError: res.json is not a function
[0] at newAccount.save.then.account (/Users/rishi/plaid-auth/routes/api/plaid.js:97:55)
[0] at process._tickCallback (internal/process/next_tick.js:68:7)

这里有很多帖子都提到 res.json is not a function 错误,但所提出的解决方案都不适合我。我很困惑为什么会抛出这个错误,因为我在应用程序的另一部分使用相同的约定,并且 res.json 工作得很好。请参阅下面的示例,了解 res.json 的工作原理。

// @route POST api/posts
// @desc Create a post
// @access Private
router.post(
"/",
passport.authenticate("jwt", { session: false }),
(req, res) => {
const { errors, isValid } = validatePostInput(req.body);

// Check validation
if (!isValid) {
return res.status(400).json(errors);
}

const newPost = new Post({
text: req.body.text,
name: req.body.name,
avatar: req.body.avatar,
user: req.user.id // current logged in user
});

// res.json works just fine
newPost.save().then(post => res.json(post));
}
);

最佳答案

因为这段代码

if (PUBLIC_TOKEN) {
client
.exchangePublicToken(PUBLIC_TOKEN)
.then(res => {
ACCESS_TOKEN = res.access_token;

当你执行这一行newAccount.save().then(account => res.json(account));时,res不再是函数router上的那个.post('/accounts/add', (req, res) => {})

因此,解决方案很简单,将 promise exchangePublicToken 中的 res 更改为其他内容,如下例所示。

您将 Promise 回调中的参数命名为与上面 router.post 中的回调中的参数相同

if (PUBLIC_TOKEN) {
client
.exchangePublicToken(PUBLIC_TOKEN)
.then(exchangeResponse => {
ACCESS_TOKEN = exchangeResponse.access_token;

关于javascript - Node.js - TypeError : res. json 不是函数(在某些路由中工作,在其他路由中不起作用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53685554/

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