[英]Node.js - TypeError: res.json is not a function (working in some routes and not in others)
在MERN堆栈(Mongo,Express,React,Node)中工作,并在我的API中遇到错误。
这是我的plaid.js
文件,其中我的一条路由plaid.js
此错误。 当然,我已经删除了所有秘密令牌变量,但假定一切正常,直到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 is not a function
。
[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 is not a function
错误,但是没有提出的解决方案对我res.json is not a function
。 我很困惑为什么会引发此错误,因为我在应用程序的另一部分中使用了相同的约定,并且res.json
正常工作。 请参见下面的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更改为其他示例,例如下面的示例。
您正在将promise回调中的参数命名为与router.post上的回调中的参数相同
if (PUBLIC_TOKEN) {
client
.exchangePublicToken(PUBLIC_TOKEN)
.then(exchangeResponse => {
ACCESS_TOKEN = exchangeResponse.access_token;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.