Nodejs API 在 localhost 中回复 JSON,但相同的 API 调用,在部署 heroku 时回复空 JSON
Posted
技术标签:
【中文标题】Nodejs API 在 localhost 中回复 JSON,但相同的 API 调用,在部署 heroku 时回复空 JSON【英文标题】:Nodejs API replies JSON in localhost, but same API call, replies empty JSON when deployed heroku 【发布时间】:2021-05-28 20:15:45 【问题描述】:app.js
const app = express()
const port = process.env.PORT || 5000
var cors = require('cors')
var bodyparser= require('body-parser')
app.use(bodyparser.json());
const route=require('./routes')
app.use(cors());
app.use('/api',route)
app.listen(port, () =>
console.log(`Example app listening at http://localhost:$port`)
)
routes.js
const express=require('express');
const Instagram = require('instagram-downloader');
const router=express.Router();
router.get('/',(req,res)=>
res.json("App Running...")
)
router.get("/inst", async (req,res)=>
ps=req.query.ps
try
await Instagram(ps)
.then(data =>
const entry_data: PostPage = data;
return PostPage.map(post => post.graphql.shortcode_media)
)
.then(images => images.map(img => res.json(img.video_url)))
.then(console.log)
catch (error)
res.json(error)
)
module.exports=router;
package.json
"name": "final",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts":
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node apps.js"
,
"keywords": [],
"author": "",
"license": "ISC",
"dependencies":
"body-parser": "^1.19.0",
"cors": "^2.8.5",
"express": "^4.17.1",
"instagram-downloader": "0.0.0"
当我运行 API 调用 http://localhost:5000/api/inst?ps=https://www.instagram.com/p/BaaDHe5AdPH/?utm_source=ig_web_copy_link 它返回给我一个 JSON。
当我在 heroku 上运行相同的 API 调用 (https://reels2.herokuapp.com/api/inst?ps=https://www.instagram.com/p/BaaDHe5AdPH/?utm_source=ig_web_copy_link) 时,它什么也没给我。
请帮我解决这个问题
【问题讨论】:
【参考方案1】:这很可能是由于发出请求的 IP 地址所致。 Instagram 不允许此类 API 请求。它在您的本地主机上运行,因为 Instagram 可以检测到此 IP 属于真人而不是虚拟服务器。
可以通过在使用用户名和密码进行身份验证后创建会话,然后使用该会话发出 API 请求来解决。另请注意,通过服务器登录也会导致问题,因为 IP 地址不会被识别并被视为可疑帐户活动。系统将要求您通过登录挑战。
【讨论】:
【参考方案2】:通过正确处理错误,您将看到实际的错误。
这只是错误对象默认序列化为 的可悲事实 我觉得 nodejs 创建者在这里做了一个错误的选择。 尽管如此:
var error = new Error('hello');
res.json(error)
// returns an empty object
因为
var error = new Error('hello');
console.log(JSON.stringify(error));
// shows
console.log(error);
// shows actual error
console.log(JSON.stringify(message: error.message, stack: error.stack));
// "correctly" convert error to json
序列化错误对象的另一种方法是使用这个包:https://www.npmjs.com/package/serialize-error
及详细情况说明:Is it not possible to stringify an Error using JSON.stringify?
【讨论】:
以上是关于Nodejs API 在 localhost 中回复 JSON,但相同的 API 调用,在部署 heroku 时回复空 JSON的主要内容,如果未能解决你的问题,请参考以下文章
从 localhost Vue 项目调用 api 时出现 NodeJS CORS 错误