【问题标题】:res.set('Content-Type','image/jpg') is not working while serving image in node jsres.set('Content-Type','image/jpg') 在节点 js 中提供图像时不起作用
【发布时间】:2020-10-21 15:31:29
【问题描述】:

res.set('Content-Type', 'image/jpg') 在节点 js 中为我们提供文件时不起作用。请查看代码此代码有什么问题。我正在从数据库中获取用户值和头像二进制值,但无法在浏览器上看到它。

http://localhost:3000/users/5f8930bba34fd3166c1b3f72/avatar 我在本地服务器上点击这个 URL

router.get('/users/:id/avatar', async (req,res)=>{
        try {
            const user= await User.findById(req.params.id)
            if (!user || user.avatar){
                throw new Error('Avatar not found !!')
            } 
            res.set('Content-Type','image/jpg')
            res.send(user.avatar)
        } catch (error) {
            res.status(404).send()
        }
    })

以下是我的依赖项:

"dependencies": {
    "bcryptjs": "^2.4.3",
    "express": "^4.17.1",
    "jsonwebtoken": "^8.5.1",
    "mongodb": "^3.6.2",
    "mongoose": "^5.10.8",
    "mongoose-unique-validator": "^2.0.3",
    "multer": "^1.4.2",
    "validator": "^13.1.17"
  }

这是我的用户模型

const userSchema=new mongoose.Schema({
    name:{
        type:String,
        required:true,
        trim:true,
        //unique:true,
    },
    age:{
        type:Number,
        default:0,
        validate(value){
            if(value<0){
                throw new Error('Age must be positive number')
            }
        }
    },
    email:{
        type:String,
        required:true,
        trim:true,
        unique:true,
        lowercase:true,
        validate(value){
            if(!validator.isEmail(value)){
                throw new Error('Email is invalid')
            }
        }
    },
    password:{
        type:String,
        required:true,
        minlength:7,
        trim:true,
        validate(value){
            if(value.toLowerCase().includes('password')){
                throw new Error('Password can not contain "password"');
            }
        }
    },

    tokens:[{
        token:{
            type:String,
            required:true
        }
    }],

    avatar:{
        type:Buffer
    }
    
},{
    timestamps:true
})

【问题讨论】:

    标签: node.js file express content-type serving


    【解决方案1】:

    使用res.setHeader()

    res.setHeader('content-type', 'image/jpg');
    

    【讨论】:

    • 我试过 res.setHeader('content-type', 'image/jpg');但这对我不起作用。我正在发送我的用户模型,它会更有帮助。
    • 试试image/jpeg而不是image/jpg
    • res.set('Content-Type','image/jpg')。它正在工作。威廉答案也有效。代码的问题在于条件没有正确编写。
    • 谢谢,威廉!!
    • 最佳实践是一直使用setHeader。如果您同意,请接受。
    【解决方案2】:

    res.set('Content-Type', 'image/jpg') 与在浏览器上显示图片之间没有关系。

    首先您应该添加头像..如果您使用邮递员使用帖子头像发出新请求,那么您可以在浏览器中看到它。

    提示:你有一个错误,如果条件应该是: if (!user || !user.avatar) 而不是 if (!user || user.avatar)

    【讨论】:

      猜你喜欢
      • 2018-02-18
      • 2017-04-11
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 2017-06-01
      相关资源
      最近更新 更多