我正在使用the 'slug' npm library来提供字符串 - 短划线 - 清洁度。当我将console.log()作为一个字符串时,该库可以正常工作,并且它需要正确地存储到所有相关的控制器中。
但是,我无法弄清楚如何正确地实现slug()来格式化我的URL。我遇到的问题是产品名称可能是“Foo Bar Baz Quux”,但我似乎找不到slug()的正确实现,而不会破坏app.js路由和findOne查询之间的连接猫鼬。
app.js
app.get('/market/:product_name', marketController.getProduct);
controller.js
exports.getProduct = function(req, res, next) {
var product_name = req.params.product_name;
// var slugProduct = slug(product_name);
Product.findOne({'name': product_name}, function(err, product) {
if (err) return next(err);
return res.send(product.data);
});
}
答案 0 :(得分:0)
也许您可以通过在设置“产品架构”时定义 slug
属性来“slugify”产品。如果将 mongoose
与 mongoose-slug-generator
插件一起使用,我可以确认它有效,请参阅 link... 您可以按如下方式设置:
const mongoose = require('mongoose');
const { Schema } = mongoose;
const slug = require('mongoose-slug-generator');
// * mongoose slug generator options
const options = {
separator: '-',
lang: 'en',
truncate: 120
};
// * Init mongoose slug generator plugin
mongoose.plugin(slug, options);
const ProductSchema = new Schema({
name: {
type: String,
trim: true
},
slug: {
type: String,
slug: 'name', // genarating slug from multiple properties is allowed ['name', 'brand']
unique: true
},
price: {
type: Number,
required: true
},
brand: {
type: String,
default: 'Apple'
}
});
module.exports = mongoose.model('Product', ProductSchema);
exports.getProduct = function(req, res, next) {
const { product_name } = req.params;
Product.findOne({ slug: product_name }, function(err, product) {
if (err) return next(err);
if (!product) {
return res.status(404).json({
message: 'Product data not found.'
);
}
res.status(200).send(product);
});
}
app.get('/market/:product_name', marketController.getProduct)
// request
const response = await axios.get('/api/market/my-awesome-product')
// response.data
{
"_id": "60fh4d37ac1a1c6f58d6a5f4",
"name": "My Awesome Product",
"slug": "my-awesome-product",
"price": 85.9,
"brand": "Apple"
}