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
, 无法正常展示中文
编码为65001, 字体使用 宋体
, 正常展示中文
编码为437, 字体使用 宋体
, 正常展示中文
2. 腾讯云邮件推送接口发送附件
- SMTP服务地址:smtp.qcloudmail.com
- SMTP服务端口号:465
- 配置入口: https://console.cloud.tencent.com/ses/address
- nodemailer对附件格式说明: https://nodemailer.com/message/attachments/
- 腾讯云邮件推送常见错误及解释: https://cloud.tencent.com/document/product/1288/51060
在使用腾讯云 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
值中不能有特殊字符, 且要用引事情引起来