Common Tips and Errors in Node.js Development
Common Tips and Errors in Node.js Development

Common Tips and Errors in Node.js Development

Common Tips and Errors in Node.js Development

1. readline/readline-sync 中文乱码 (chaos code)

这两个包在windows系统下的cmd命令行执行会出现乱码, 示例代码如下:

var readline = require('readline');
var rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
var msg = 'Chinese Fonts 中文 (Y/n)?';
var utf8 = Buffer.from(msg, 'utf8').toString();

rl.question(msg, ans => {
    console.log('msg question', ans);

    rl.question(utf8, ans => {
        console.log('utf8 question', ans);
        rl.close();
    });
});

主要原因为字体设置不对,设置为Nsim宋后,全部正常了. 和什么Active Code Page没啥关系. 通过 chcp 65001改变控制台编码后, 可以设置控制台字体显示为更友好的英文字体,而默认的 936/437等无法修改为漂亮的英文字体. 就这么点区别, 不算瞎折腾. 以下是折腾经过

编码为65001, 字体使用 Lucida Console, 无法正常展示中文

file

编码为65001, 字体使用 宋体, 正常展示中文

file

编码为437, 字体使用 宋体, 正常展示中文

file

2. 腾讯云邮件推送接口发送附件

在使用腾讯云 SMTP 推送接口发送邮件时,经常会报 FailedOperation.InvalidAttachName错误码, 原因是attachments参数不能使用常规的 {filename, path} 或者 {filename, content, encoding}等格式, 会直接报附件名称错误. 一开始查文档时,说是文件扩展名有限制导致的报错,实际实践下来并不是. 只能使用 raw格式的请求头自己拼接, 以下为正确示例:

const nodemailer = require('nodemailer')
const filename = `测试文件.key`;
const mimeType = `application/octet-stream`;
const content =  '附件正文内容';
const attachments = [
    {
      raw: [
        'Content-Transfer-Encoding:base64',
        `Content-Disposition:attachment;filename="${filename}"`,
        `Content-Type:${mimeType};name="${filename}"`,
        '',
        Buffer.from(content, 'utf8').toString('base64')
      ].join('\r\n'),
    },
];
const message = {
    to: 'email_receiver@address.com',
    attachments,
    html: 'your html formated email content',
    subject: 'email title',
    from: 'your_smtp@email.com',
};
const transporter = nodemailer.createTransport({
    host: 'smtp.qcloudmail.com',
    port: 465,
    secure: true,
    auth: {
      user: 'your_smtp@email.com',
      pass: 'your_smtp_pass_word',
    },
});
transporter.sendMail(message, (err, res) => {
  console.log('send mail response', err, res);
});

需要注意的是

  • Content-Disposition要指定 filename参数, 否则在邮件的附件名就会把mimeType部分当成文件名
  • Content-Type也要指定name参数,保持和filename一致
  • filename, name 值中不能有特殊字符, 且要用引事情引起来

3. More Tips comming soon