【问题标题】:Can't create REST API with a longer path无法创建路径较长的 REST API
【发布时间】:2019-09-04 03:06:33
【问题描述】:

我是 node 的初学者,我到处寻找答案,但我似乎无法解决这个问题。我正在使用 express、mongoose 和 Vuex。

我基本上想定义两个端点——一个用于获取特定用户的照片,另一个用于获取所有用户的所有照片。我的第一个端点是 /api/photos,它运行良好,但 /api/photos/all 总是会出现错误。但是,我知道我在 Vuex 中发出请求的方式没有任何问题,因为如果我将 /photos 中的代码替换为 /photos/all 的代码,它就可以工作。我已经尝试了 /photos/____ 的各种替代方案,但它似乎不喜欢这条路?节点错误没有帮助,因为它说

CastError:模型“Photo”的路径“_id”处的值“all”转换为 ObjectId 失败

但我知道这不是问题,因为当我将端点定义为 /photos 时,这两个调用都有效。

这是我的 store.js

async getAllPhotos(context) {
  try {
    let response = await axios.get("/api/photos/all");
    context.commit('setPhotos', response.data);
    return "";
  } catch (error) {
    return "";
  }
},
async getOnePhoto(context, id) {
  try {
    let response = await axios.get("/api/photos/" + id);
    context.commit('setSelectedPhoto', response.data);
  } catch (error) {
    return "";
  }
},

我的 photo.js:

const mongoose = require('mongoose');
const express = require("express");
const router = express.Router();
const auth = require("./auth.js");

// Configure multer so that it will upload to '/public/images'
const multer = require('multer')
const upload = multer({
    dest: '../public/images/',
    limits: {
        fileSize: 10000000
    }
});

const users = require("./users.js");
const User = users.model;

const photoSchema = new mongoose.Schema({
    user: {
        type: mongoose.Schema.ObjectId,
        ref: 'User'
    },
    path: String,
    title: String,
    description: String,
    name: String,
    created: {
        type: Date,
        default: Date.now
    },
});

const Photo = mongoose.model('Photo', photoSchema);
// get photos for user
router.get("/", auth.verifyToken, User.verify, async (req, res) => {
    try {
        let photos = await Photo.find().sort({
          created: -1
        }).populate('user');
        return res.send(photos);
      } catch (error) {
        console.log(error);
        return res.sendStatus(500);
      }
});

// get all photos THIS DOESNT WORK NO MATTER WHAT CODE GOES IN
router.get("/all", async (req, res) => {
    // return photos
    try {
        let photos = await Photo.find({
            user: req.user
        }).sort({
            created: -1
        });
        return res.send(photos);
    } catch (error) {
        console.log(error);
        return res.sendStatus(500);
    }
  });

// get individual photo
router.get("/:id", async (req, res) => {
    try {
        // console.log("I'm here")
        let photo = await Photo.findOne({ 
            _id: req.params.id 
        });
        res.send(photo);
    } catch (error) {
        console.log(error);
        res.sendStatus(500);
    }
})

还有我的 server.js:

const express = require('express');
const bodyParser = require("body-parser");

const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: false
}));

const mongoose = require('mongoose');

// connect to the database
mongoose.connect('mongodb://localhost:27017/photobomb', {
  useNewUrlParser: true
});

const cookieParser = require("cookie-parser");
app.use(cookieParser());

const users = require("./users.js");
app.use("/api/users", users.routes);

const photos = require("./photos.js");
app.use("/api/photos", photos.routes);

const comments = require("./comments.js");
app.use("/api/comments", comments.routes);

app.listen(4000, () => console.log('Server listening on port 4000!'));

【问题讨论】:

  • 路由序列有问题,请提供./photos.js的代码,以便我们推荐
  • @ArifKhan 完成!
  • 提供./photos.js的完整代码,肯定有2条路线会产生冲突。在前端,我可以看到 axios.get("/api/photos/all")axios.get("/api/photos/" + id);,但在后端,您没有提供必须类似于 /api/photos/:id 的路由
  • 啊,是的。我已经添加了@ArifKhan

标签: node.js express vue.js mongoose vuex


【解决方案1】:

转换错误指出您可能使用了错误的参数来查找数据,通过查看上面的代码,我认为您正在尝试检索被查询用户的所有照片,如果是这种情况,用户架构必须具有与带有 objectId 的照片集合相关联的照片键,如下所示,因此您可以查询用户并填充图像参数,这将给出与用户关联的图像列表。在猫鼬中查找与 OBJECTID 的集合关联 What's Mongoose error Cast to ObjectId failed for value XXX at path "_id"? 此链接解释了您遇到的错误。希望对您有所帮助

{
   "user":String,
   "images":["imgs":{
                "type":mongoose.Schema.Types.ObjectId,
                "ref":"Photos"  
               }]

}

【讨论】:

    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2018-04-20
    • 2018-10-25
    相关资源
    最近更新 更多