◆ オプション引数は使われないので 自分で getEncoder で取得してオプション設定する

iconv-lite を使うときに encoding に存在しない文字が来た場合にはデフォルトの文字に置き換えられます

const iconv = require("iconv-lite")

const buf = iconv.encode("ABCあいう①⚠", "sjis")
console.log(iconv.decode(buf, "sjis"))
// ABCあいう①?

デフォルトでは ? になります
? って本文中でも出てきそうでわかりづらいですよね

これは iconv オブジェクトの defaultCharSingleByte プロパティを設定して変更できます

const iconv = require("iconv-lite")

iconv.defaultCharSingleByte = "@"

const buf = iconv.encode("ABCあいう①⚠", "sjis")
console.log(iconv.decode(buf, "sjis"))
// ABCあいう①@

文字を @ に変更してみました

これの問題点はグローバル設定なところです
変換ごとに指定したい場合には毎回 iconv 全体の設定を変えることになります
同期処理なので変換の前後に切り替える関数を用意するで対処できます

const iconvEncode = (text, encoding, default_char) => {
const def = iconv.defaultCharSingleByte
if (default_char) iconv.defaultCharSingleByte = default_char
const result = iconv.encode(text, encoding)
iconv.defaultCharSingleByte = def
return result
}

でも なんか気持ち悪さが残ります
ソースを見ると encoding 引数の次にオプションを渡せるようです
ここで指定できるのかなと思ったのですが codec のオプションそのままでユーザが渡すオプションは無視されてました
ライブラリのコードを直接変えるのは避けたいので諦めようとしたのですが ソースを見た感じでは encode 関数の中で使ってる getEncoder は外部から参照できるようになってました
つまり 自分で getEncoder を取得してオプションを設定した上で encode 関数と同じような処理を行えば encoder 単体に設定を行えます

ということで作ったものがこれです
ほぼ encode 関数のコピーです

const iconv = require("iconv-lite")

const iconvEncode = function (str, encoding, options) {
str = "" + (str || "")

var encoder = iconv.getEncoder(encoding, options)
if (options.defaultCharSingleByte) {
encoder.defaultCharSingleByte = options.defaultCharSingleByte.charCodeAt(0)
}

var res = encoder.write(str)
var trail = encoder.end()

return (trail && trail.length > 0) ? Buffer.concat([res, trail]) : res
}

encoder 取得後の defaultCharSingleByte の設定だけ追加してます
使用例です

{
const buf = iconvEncode("ABCあいう①⚠", "sjis", { defaultCharSingleByte: "*" })
console.log(iconv.decode(buf, "sjis"))
// ABCあいう①*
}
{
const buf = iconv.encode("ABCあいう①⚠", "sjis")
console.log(iconv.decode(buf, "sjis"))
// ABCあいう①?
}

代替文字なら見える文字になってるほうがいいですが 除去したりエラー通知をするなら絶対に含まれないような文字のほうがいいです
? などの記号はユーザ入力に含まれる可能性があるので キーボードから入力しないような制御文字にしておきます

const buf = iconvEncode("ABCあいう①⚠", "sjis", { defaultCharSingleByte: "\x1a" })
if (buf.includes(0x1a)) {
console.error("includes invalid character")
}