Node.js Can';无法从post请求中检测\n字符串中的字符

Node.js Can';无法从post请求中检测\n字符串中的字符,node.js,rsa,Node.js,Rsa,我需要将私钥、公钥(使用ursapackage生成)和文件发布到NodeJs服务器,以便对该文件进行签名。这些键的格式如下: -----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQCt6tv2w4sEuHrvCtIgmajM3Dbf7S0aXdM1aG2kON/uG4ibd7R1\n6o osp847tXgYYJaOB1lKRRDqUETLg1n6LqMHnzNF1NvC0bEtXym90TIXd2CosmWm\nX/R+52 JdM5vuH5kO

我需要将私钥、公钥(使用
ursa
package生成)和文件发布到NodeJs服务器,以便对该文件进行签名。这些键的格式如下:

    -----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQCt6tv2w4sEuHrvCtIgmajM3Dbf7S0aXdM1aG2kON/uG4ibd7R1\n6o
osp847tXgYYJaOB1lKRRDqUETLg1n6LqMHnzNF1NvC0bEtXym90TIXd2CosmWm\nX/R+52
JdM5vuH5kOMuzmYhBTkd8uJln7P+FbuRe9mikRcNSDD2pWojWF3QIDAQAB\nAoGAXhEUrj
Bvpbr+SwKoSpex1DQbvhwzc/phfZahDtzwSYI87hHd2pVj7OlKQ8NQ\nVKcRZ3qUEfavQn
zt6MF/zjChXl67pEG9P6Jv1EAoZjLXf58w0iTJbLZU12Ds53kl\nI4OxnyOCDmPMQiUuDE
XbiJaornSr8Wve8nGje98Ew/WiC6ECQQDUYyJKyGWJXKby\nTe4jj7Wu184v/kgMgRPeOV
3IQZ3WaZDV10BqHd6Nz8ey9sY9hFJML2naSMNSyDXR\nSV5sn/QZAkEA0aFtOvu7K+TEIW
mT14KLN+53IwZ5TVZFomyogkORDe9Q1reIAzV0\n2pNHXiJqMr/MKlp8RD1AKtiWkl6RC/
L4ZQJBAJHy/eG+DGh0jxT7kKZHX2ajTkGU\n0BYnrWuMqHGxBbIOIUWSAeXqWMHDA0xsYJ
Ztk9Be1LL4RaFhi/oiHQ0wbiECQGPY\nnn08jz7t3FkJv2gjfonqZAZju/0Q/WPKm0xIQF
vBw+AxVHAq0viUs6Zrf+eiIO1/\nYbbi8aA2vykCL9XgKV0CQQCeMDc0AJBunncUSgWDnx
AJgW7Th3ukYpEBrJ5gUOpx\n8HKTaIQRv8KLsOkkBhNc5vndTjNDkhJ/ToSkk3tkU29v\n
-----END RSA PRIVATE KEY-----\n
问题是,当我将此类字符串发布到服务器时,服务器无法检测到新行字符,并且我在签名时出错(
未检测到起始行
)。 然而,若我将这一行直接粘贴到服务器上的函数中,那个就可以了。 因此,我的客户端html是:

<form id="addFile">
 <div>
   <textarea type="text" id="publicKey" name="publicKey" placeholder="public"></textarea>
 </div>
 <div>
   <textarea type="text" id="privateKey" name="privateKey" placeholder="private"> </textarea>
 </div>
 <div>
   <input type="file" id="document" name="document">
 </div>
 <div>
   <input type="submit" onclick="post()" value="Submit">
 </div>
 </form>

    <script>
      function post() {
        var form = new FormData(document.getElementById('addFile'));
          fetch("http://localhost:3001/postfile", {
            method: "POST",         
            body: form
          });
        }
    </script>

换行不是你的问题。您的问题出现在
文本区域
,您发布的私钥开头带有空格

<textarea> </textarea>
<!--      ^ this bad boy -->
除了删除文本区域中的空白之外

您可能应该在服务器端执行
.trim
,以避免用户添加空格时出现任何问题

const publicKey =  req.body.publicKey.trim();
const privateKey = req.body.privateKey.trim();
出现该特定错误,因为密钥必须以
----BEGIN RSA私钥------

更新

您实际上是在粘贴私钥:
\n
(这些不是换行符,只是文字
\\n
,您不应该这样做,但要修复它:

 const privateKey = req.body.privateKey.replace(/\\n/g, '\n').trim();
当您在文本区域中发布包含
\n
的字符串时,它在javascript中不等于:
\n
,它将等于
\\n

const text=document.getElementById('text').innerHTML;
log(`${text}:${text==='\n'}`);
console.log(`${text}:${text==='\\n'}`);

\n
我怀疑服务器是否能检测到它,您能在开发人员控制台上显示请求吗?请显示您的服务器端代码,无论您使用什么来解析
多部分/表单数据
都可能会修剪换行符。我已经更新了一些信息。控制台中的错误无需担心。它说文件不会被发送,但实际上已经发送了发送良好您有一个由textarea引起的小错误:实际上是相同的问题(
var ret=this.\u handle.sign(toBuf(key)、密码短语、rsaPadding错误:错误:0906D06C:PEM例程:PEM\u read\u bio:sign.sign没有起始行(crypto.js:331:26)
您确定在服务器端添加了
.trim
吗?因为您可能正在复制带有额外空格的密钥,请执行:
console.log(privateKey)
并显示输出请看,我添加了console.log图片,是的-我添加了trim,但取决于您的密钥,如果它都在一行中,或者如果有多行,它仍然会失败,因为您将混合使用
\n
\\n
我的意思是,真正的私钥有多行,它不能是单行的,但既然您这样做了没有实际的换行符,你有
\\n
如果你发布的不是一行,你将把
\\n
\n
混合在一起,这对我的答案不起作用(但这是一个真正的错误键)。在这种情况下,你应该首先删除真正的换行符,然后解析
\\n
如果(key.includes('\\n'))key=key.replace(/\n/g',).replace(/\\n/g',\n')
const publicKey =  req.body.publicKey.trim();
const privateKey = req.body.privateKey.trim();
 const privateKey = req.body.privateKey.replace(/\\n/g, '\n').trim();