javascript - 如何解决通过id查找商品的问题?
问题描述
当我遵循以下路线时:'/gallery' 我从文件 './posts.json' 中获取所有项目并将它们显示在屏幕上。但是当我转向路线时:'/gallery/:id' 我想通过它的id
.
但是我得到一个错误:const pictureId = this.formatePicture.findIndex(p => p.id == parseInt(id)); TypeError: this.formatePicture.findIndex is not a function.
我试图做for in
by data
,但是在循环之后没有对象属性。
告诉我我做错了什么以及如何解决这个问题,以便我id
在去路线'/gallery/:id'时得到项目
应用程序.js:
const express = require('express');
const Database = require('./db');
const app = express();
const port = 3000;
const db = new Database();
app.use(express.json());
app.get('/gallery', (req, res) => {
if (req.query.id) {
const picture = db.read(req.query.id);
picture.then(data => {
res.send(data);
})
} else {
const pictures = db.read();
pictures.then(data => {
res.send(data);
})
}
});
app.get('/gallery/:id', (req, res) => {
const picture = db.read(req.params.id);
if (!picture) {
res.status(404);
res.send();
} else {
picture.then(data => {
res.send(data);
})
}
});
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
});
db.js:
const fs = require('fs');
class Database {
constructor() {
this.formatePicture = [];
}
read (id) {
return new Promise((resolve, reject) => {
fs.readFile('./posts.json', 'utf-8', (err, data) => {
if (err) {
reject(err)
}else if(id) {
this.formatePicture = JSON.parse(data);
const pictureId = this.formatePicture.findIndex(p => p.id == parseInt(id));
resolve(pictureId)
}
else {
resolve(data)
}
})
})
}
}
module.exports = Database;
帖子.json:
{
"posts": [
{
"id": 1,
"date": "2018-10-22T14:10:37.578Z",
"title": "accusamus beatae ad facilis cum similique qui sunt",
"url": "https://i.pinimg.com/originals/90/39/16/903916b9f0db6992f1a4b66ae3129fbe.jpg"
},
{
"id": 2,
"date": "2018-10-22T14:10:37.578Z",
"title": "reprehenderit est deserunt velit ipsam",
"url": "https://vignette.wikia.nocookie.net/okup/images/d/da/C683c20a5b0ae062b2325653f2fd3bdf.jpg/revision/latest?cb=20170131193210&path-prefix=da"
}
]
}
解决方案
解析的数据是一个对象,需要定位的数组在字段中posts
this.formatePicture.posts.findIndex(...)
在不修改数据库代码的情况下实现此目的的另一种方法是更改结构posts.json
,使其看起来像这样
[
{
"id": 1,
"date": "2018-10-22T14:10:37.578Z",
"title": "accusamus beatae ad facilis cum similique qui sunt",
"url": "https://i.pinimg.com/originals/90/39/16/903916b9f0db6992f1a4b66ae3129fbe.jpg"
},
{
"id": 2,
"date": "2018-10-22T14:10:37.578Z",
"title": "reprehenderit est deserunt velit ipsam",
"url": "https://vignette.wikia.nocookie.net/okup/images/d/da/C683c20a5b0ae062b2325653f2fd3bdf.jpg/revision/latest?cb=20170131193210&path-prefix=da"
}
]
作为旁注:
您可能想要使用find
而不是findIndex
因为pictureId
是您共享的初始代码的索引
它可能看起来像这样
const picture = this.formatePicture.find(p => p.id == parseInt(id));
// checking if we found an entry first
if (picture) {
resolve(picture.id);
} else {
reject(/* some error about resource not being found */)
}
推荐阅读
- reactjs - React HOC with TypeScript:可以用不同的约束子类型来实例化
- java - 为我的 API 的每个用户创建一个线程会很好地扩展吗?
- sql - 使用 group by 和 count 创建赢/输记录
- javascript - 如何通过单击停止 setInterval 中的计时器,然后再次单击恢复?
- pdf - MS Word 2016 批量辅助功能
- firebase - Firestore:错误:4 DEADLINE_EXCEEDED:已超过截止日期
- javascript - 未调用 ng-content 中的组件构造函数
- asp.net - 如何从后面的代码中禁用引导控件
- mongodb - Refs mongo 不使用 graphql 工作 nestjs
- azure - Service Fabric Start-ServiceFabricClusterConfigurationUpgrade 不断超时