下面这个例子既写明如何利用 node.js 上传本地图片到服务器,又将 http 异步请求方法改为同步。

上传图片主要借用的是 form-data 模块。

异步变同步主要还是利用 Promise 类与 async/await 关键字相结合。

const https = require('https');
const fs = require('fs')
const FormData = require('form-data')

/**
 * 上传图片到图壳
 * 利用Promise和await将上传方法做成同步调用
 * @param filePath
 */
function uploadPictureToImgKr(filePath) {
    return new Promise((resolve, reject) => {

        const formData = new FormData()
        formData.append('file', fs.createReadStream(filePath))

        const headers = formData.getHeaders()
        // 自定义请求头
        // headers.Cookie = ''
        headers['user-agent'] = 'Mozilla/5.0'
        const request = https.request({
                                          host: 'imgkr.com',
                                          method: 'POST',
                                          path: '/api/files/upload',
                                          headers: headers
                                      }, (response) => {
            if (response.statusCode !== 200) {
                // 手动消费数据
                response.resume();
                reject('上传图片失败,响应码' + response.statusCode)
                return;
            }
            let body = '';
            response.on('data', (buffer) => {
                body += buffer;
            });
            response.on('end', () => {
                resolve(body)
            });
        });

        // 关键的一步
        formData.pipe(request)

        request.on('error', (e) => {
            reject('problem with request: ' + e.message)
        });
    })
}


async function main(){
    console.log('===开始上传图片===')
    await uploadPictureToImgKr(`${__dirname}/img.jpg`).then(value => {
        try {
            console.log(JSON.parse(value))
        } catch (e) {
            console.log(value)
        }
    }).catch(reason => {
        console.log(reason)
    })
    console.log('===上传图片结束===')
}

main().then(r => console.log('===Main方法执行完毕==='))
console.log("===JS文件执行完毕===")

打印结果:

===开始上传图片===
===JS文件执行完毕===
{
  code: 200,
  message: '请求成功',
  success: true,
  data: 'https://imgkr.cn-bj.ufileos.com/1f04bb2e-f468-46d2-b86f-dd3494193583.jpg'
}
===上传图片结束===
===Main方法执行完毕===